DOM标准是独立的(即并不依赖JS)操作结构化文档的方式
BOM实际是个与浏览器有关的对象集合,原来没任何标准可言,H5诞生后才被定义了一些浏览器间通用的对象标准
ES5严格模式"use strict"是一个JS字符串,虽然没将其赋值给某个变量,执行后也不会 有什么效果,但符合JS语法,因此不支持ES5严格模式的老式浏览器会直接忽略它,使用严格模式不会让老式浏览器无法执行代码
与传统的面向对象语言不同,JS实际上没有类,该语言的一切都是基于对象,其依靠的是一套原型系统。由于没有类,JS的继承发生在对象之间
JS中所有的属性和方法都是public的,但其还是提供了隐藏数据的方法
OOP常用到的概念:类、对象、属性、方法、聚合、封装、继承、多态
变量的初始化是指变量的第一次赋值
可在单个var语句中声明(并初始化)多个变量,用逗号隔开即可
var a,b,c='Hi',d;
1+2,1和2为操作数,+为运算符,1+2这个整体称为表达式
访问一个不存在的变量,或变量声明后未赋值,将会显示undefined,因为JS会自动在变量初始化前的值设为undefined,而undefined类型的值只有一个:undefined
JS有六种数据类型:number、string、boolean、undefined、null和object,任何不属于前面五种基本数据类型的值都会被认为是一个对象
typeof可能返回的结果有:
- "number"
- "string"
- "boolean"
- "undefined"
- "object"
- "function"
指数表示法,如2e1或者2e+1,都表示2的后面有1个0,而3e+3表示3的后面有3个0,即3000
也可以理解为小数点向后移动了3位,所以2e-1表示0.2
JS中有一种叫做Infinity的特殊值(注意i是大写),代表的是超出了JS处理范围的数值,但Infinity依然是一个数字,所以typeof Infinity返回的是“number”
注意:任何数除以0结果也为Infinity
Infinity表示最大值(或比最大值还大的数),而最小值为-Infinity
Infinity与任何数进行算术运算得到的结果仍为Infinity
Infinity - Infinity = NaN
NaN虽然意思是“Not a number”,但和Infinity一样,也是number类型。所以两者是特殊的数字
> var a = NaN;
> a;
NaN
NaN是有传染性的,若一个算术运算中存在一个NaN,则整个运算就会失败,也为NaN
将一个数字字符串进行算术运算时(+除外),该字符串会自动被转换成number类型,于是将数字字符串转换为数字就有了种偷懒的方法,与1相乘,当然更好的选择是使用parseInt()函数。若转换失败则结果是NaN
\u后面的字符会被视为unicode码如“\u0421\u0422”
如果对一个非布尔值执行逻辑运算,那该值会在计算过程中被转换成布尔值
> var b = 'one';
> !b
false
字符串“one”先自动被转换为布尔值true,然后再取反
另外,使用双重取反操作,可以很轻易地将任何值转换为相应的布尔值
逻辑运算符中,! 优先级最高,其次是&&,最后是||
** JavaScript 引擎在一个逻辑表达式中遇到一个非布尔类型的操作数,那么该操作数的值就会成为该表达式所返回的结果**
> true || "something";
true //短路或,前面为true,后面不再执行
> true && "something";
"something" //JS引擎在逻辑表达式中遇到非布尔类型的值,会将其作为该表达式的结果返回
> true && "something" && true;
true //返回最后一个执行的
通常情况下,这种行为应该尽量避免,因为它会使我们的代码变得难以理解
但在某些时候这样做也是有用的,如不能确定某个变量是否已经被定义时,如果变量 mynumber 已经被定义,就保留其原有值,否则就将它初始化。
> var mynumber = mynumber || 10; //若mynumber没被定义,则为undefined,所以相当于 false || 10
> mynumber;
==和!=这两个比较运算符,在比较前两边的操作数会自动转换为对应的布尔值
而===和!==则不存在类型转换
NaN不等于任何东西,包括它自己,NaN==NaN为false
声明一个变量时没有对其进行赋值,调用该变量时并不会出错,但 typeof操作符依然会返回"undefined"
var somevar;
somevar; //变量的调用
typeof somevar;
null类型的值只有一个:null
typeof null结果为“object”
当进行算术运算时,undefined会被转换为NaN,而null为0
数组是用于存放数据的列表,可用来存储任意类型任意数量的元素
可通过索引一个之前不存在的位置,来添加数组元素,若新元素的位置与原数组末端有一定间隔,则这其中的元素会被自动设为undefined
可使用delete来删除元素,删除后原数组长度不变,该元素变为undefined
var a = [1,2,3];
delete a[1];
console.log(a); // [1,undefined,3]
可通过这种数组访问方式来获取字符串中特定位置的字符
检查变量是否存在
最懒的方法就是条件部分直接使用变量,如if(somevar){...}
但这样做并不一定是最合适的,首先若该变量不存在则会报错,其次就算somevar转换后是false,也不意味着该变量就一定没有定义,它可能是false或0
所以检查变量是否存在更好的选择是使用typeof
if(typeof somevar !== 'undefined'){ //typeof返回的是字符串,并且就算变量不存在,也不会报错
}
switch和case括号内都是表达式(一个变量也是表达式)
var x = 1, y = 1;
switch (x + y) {
case '2':
console.log('string');
case 1 + 1 :
console.log(23);
}
case表达式的结果将会与switch语句的表达式进行比较,只有全等才为true
尽量使用default语句,这可以在switch找不到任何匹配的情况下也依然返回一些有意义的结果
for-in往往用来遍历数组或对象,主要是对象
var a = ['a','b','c'];
for(var i in a){
console.log('index:' + i + ',value:' + a[i]);
}
遍历的是数组时,i是索引,遍历对象时,i是对象属性名
注释会被JS引擎自动忽略,所以不会对程序产生任何影响
函数
函数本质上是一种代码的分组形式,通过这种形式赋予某组代码一个名字,以便之后的调用
函数通常有返回值,若没有显式的返回值,则默认返回undefined
函数调用时可传递多个参数,会根据形参数去接收,多余的会被忽略,但每个函数都有内建的arguments对象,它能返回函数所接收的所有参数
JS有一组可随时调用的内建函数,这些预定义函数包括
- parseInt()
- parseFloat()
- isNaN()
- encodeURI()
- decodeURI()
- encodeURIComponent()
- decodeURIComponent()
- eval()
parseInt()会试图将收到的任何值转换成整数类型输出,转换失败则返回NaN
parseInt('123') //123
parseInt('a123') //NaN,遇到第一个异常字母就会放弃无论剩下的部分字符串是否可用
parseInt('1a23') //1
//该函数还有可选的第二个参数,负责设定函数期望的数字类型,没有此参数则默认是十进制
parseInt('FF',10) //转换为十进制,NaN
parseInt('FF',16) //转换为十六进制,255
ES5移除八进制的默认表示法,也就是parseInt('0377')不会被认为是八进制0377
parseFloat()和parseInt()基本相同,但仅支持将输入值转换为十进制,所以该函数只有一个参数
isNaN()用来确定输入值是否是NaN,NaN或不能转换为数字的字符串等不能参与算术运算的都为true,除此之外则返回false,因此可用来检测parseInt()和parseFloat()的调用是否成功
isNaN(123) //false
isNaN(-1.23) //false
isNaN(Infinity) //false
isNaN('Hi') //true
isNaN('123a') //true
isFinite()函数,Finite意思是“有限的”,所以此函数用来检测其参数值是否是有限大的数字,Infinity、-Infinity、NaN或不能转换为数字的字符串都会返回false,其他有限数字或可转换为有线数字的字符串都返回true
isFinite(123) //true
isFinite(-1.23) //true
isFinite('Hi') //false
isFinite('123a') //false
isFinite(1e309) //由于1e309已超过Infinity,所以为false
在一些遗留代码中可能回看到相似的编码和反编码函数escape()he unescape(),但并不赞成使用这些函数来执行相关操作,它们的编码规则也不尽相同
alert()函数不是JS核心的一部分(即没有被包括在ECMA标准中),而是浏览器提供的。此函数回阻塞浏览器线程,即警告框关闭前,当前所有代码都会暂停执行
变量的定义可考虑使用“单一var”模式,即仅在函数第一行使用一个var来定义这个作用域中所有的变量,这样一来我们就能很轻松地找到相关变量的定义并且在很大程度上避免了不小心污染全局变量的情况