需要牢记的JavaScript基础知识
声明(Declarations)
undefined值在布尔类型环境中会被当作false。
数值类型环境中undefined值会被转换为NaN。
对一个空变量求值时,空值null在数值类型环境中会被当作0来对待,而布尔类型环境中会被当作false
JavaScript变量感觉上是被“提升”或移到了所有函数和语句之前。提升后的变量将返回undefined值,所以即使在使用或引用某个变量之后存在声明和初始化操作,这个被提升的引用仍将得到undefined值。
由于存在变量声明提升,一个函数中所有的var语句应尽可能地放在接近函数顶部的地方。这大大地提升了程序代码的清晰度。
(在ECMAScript2015中,let(const)将不会提升变量到代码块的顶部。因此,在变量声明之前引用这个变量,将抛出错误ReferenceError。这个变量将从代码块一开始就处在一个“暂时性死区”,直到这个变量被声明为止。)
对于函数,只有函数声明会被提升到顶部,不包括函数表达式。
/*函数声明*/ foo();//"bar" functionfoo(){ console.log("bar"); } /*函数表达式表达式定义的函数,成为匿名函数。匿名函数没有函数提升。*/ baz();//TypeError:bazisnotafunction //此时的"baz"相当于一个声明的变量,类型为undefined。 由于baz只是相当于一个变量,因此浏览器认为"baz()"不是一个函数。 varbaz=function(){ console.log("bar2"); };
全局对象是window,你可以通过指定window或frame的名字,从一个window或frame访问另一个window或frame中声明的变量。例如,设想一个叫phoneNumber的变量在文档里被声明,你可以在子框架里用parent.phoneNumber来引用它。
常量(Constants)
在同一作用域中,不能用与变量或函数同样的名字来命名常量。然而,对象属性是不受保护的,所以下面的语句执行没有问题。
constMY_OBJECT={"key":"value"}; MY_OBJECT.key="otherValue";
数据结构和类型
六种是原型的数据类型以及Object对象
- Boolean.布尔值,true和false.
- 一个表明null值的特殊关键字。JavaScript是大小写敏感的,因此null与Null、NULL或其他变量完全不同。
- 变量未定义时的属性。
- Number.表示数字,例如:42或者3.14159。
- String.表示字符串,例如:”Howdy”
- Symbol(在ECMAScript6中新添加的类型).。一种数据类型,它的实例是唯一且不可改变的。
Objects和functions是本语言的其他两个基本要素。你可以将对象视为存放值的命名容器,而将函数视为你的应用程序能够执行的过程(procedures)。
在涉及加法运算符(+)的数字和字符串表达式中,JavaScript会把数字值转换为字符串。
x="Theansweris"+42//"Theansweris42" y=42+"istheanswer"//"42istheanswer"
在涉及其它运算符(译注:如下面的减号'-‘)时,JavaScript语言不会把数字变为字符串。例如(译注:第一例是数学运算,第二例是字符串运算):
"37"-7//30 "37"+7//"377"
字符串转换为数字(convertingstringstonumbers)
parseInt()和parseFloat()
将字符串转换为数字的另一种方法是使用单目加法运算符。
"1.1"+"1.1"="1.11.1" (+"1.1")+(+"1.1")=2.2//注:加入括号为清楚起见,不是必需的。
对象属性名字可以是任意字符串,包括空串。如果对象属性名字不是合法的javascript标识符,它必须用””包裹。属性的名字不合法,那么便不能用.访问属性值,而是通过类数组标记(“[]”)访问和赋值。
varunusualPropertyNames={ "":"Anemptystring", "!":"Bang!" } console.log(unusualPropertyNames."");//语法错误:Unexpectedstring console.log(unusualPropertyNames[""]);//Anemptystring console.log(unusualPropertyNames.!);//语法错误:Unexpectedtoken! console.log(unusualPropertyNames["!"]);//Bang!
注意:
varfoo={a:"alpha",2:"two"}; console.log(foo.a);//alpha console.log(foo[2]);//two //console.log(foo.2);//Error:missing)afterargumentlist //console.log(foo[a]);//Error:aisnotdefined console.log(foo["a"]);//alpha console.log(foo["2"]);//two
在ES2015,对象字面值扩展支持在创建时设置原型,简写foo:foo分配,定义方法,加工父函数(supercalls),计算属性名(动态)。总之,这些也带来了对象字面值和类声明紧密联系起来,让基于对象的设计得益于一些同样的便利。
varobj={ //__proto__ __proto__:theProtoObj, //Shorthandfor‘handler:handler' handler, //Methods toString(){ //Supercalls return"d"+super.toString(); }, //Computed(dynamic)propertynames ['prop_'+(()=>42)()]:42 };
能在JavaScript的字符串中使用的···特殊字符···
转义字符
//引号转义 varquote="Heread/"TheCremationofSamMcGee/"byR.W.Service."; //转义反斜线 varhome="c://temp"; //转义换行一条语句拆成多行书写 varstr="thisstring/ isbroken/ acrossmultiple/ lines." console.log(str);//thisstringisbrokenacrossmultiplelines. //Javascript没有“heredoc”语法,但可以用行末的换行符转义和转义的换行来近似实现 varpoem= "Rosesarered,/n/ Violetsareblue./n/ I'mschizophrenic,/n/ AndsoamI."