数字
算术运算
Infinity表示无穷大
-Infinity表示负无穷大
下溢是指当运算结果无限接近零并比Javascript能表示的最小值还小,这种情况下,JavaScript会返回一个特殊的值,负零;溢出是指结果超出了可以表述的数字上限,如无穷大,负无穷大。
被零整除并不报错,他会返回一个无穷大Infinity或者负无穷大,但零除以零是没有意义的,会返回一个非数字值(NaN),无穷大除以无穷大,给负数开方等等这种都会放回NaN。
Javascript预定义了Infinity和NaN这两个值,这两个值是为只读的,非数字值NaN它和任何值都不相等,包括自身,判断变量是否为NaN,应当用x!=x来判断,函数isNaN()的作用与此相似,函数isFinite(),在参数不是NaN,无穷大负无穷大时返回true。
负零值当与零值几乎是完全相等的,除了作为除数之外。1/0!==1/-0
二进制浮点数和四舍五入错误
JavaScript采用二进制表示法,所以不能精确表示十进制的分数和小数,如0.1,但是JavaScript具有足够的精度,所以可以极其近似于0.1,但不能完全相等,例如.3-.2!=.2-.1
日期和时间
文本
字符串可以拆分数行写在代码中,用反斜线''隔开
转义字符
字符串的使用
字符串内置函数有
var s = "hello,wolrd"
s.charAt(0)//返回第一个字符,除了使用此方法,还可以使用中括号访问该位置的字符
s.substring(1,4)//“ell”返回第二到4个字符
s.slice(1,4)//同上
s.slice(-3)//“rld”返回最后三个字符
s.indexOf("l")//返回2,字符l第一次出现的位置
s.lastIndexOf("l")//返回10,字符l最后一次出现的位置
s.indexOf("l",3)//返回3,字符l在位置3及之后第一次出现的位置
s.split(",")//根据“,”将字符串分成两个字符串["hello","world"]
s.replace("h","H")//返回“Hello,world”,全文字符替换
s.toUpperCase()//返回“HELLO,WOLRD”
🔺JavaScript中字符串是固定不变的,原字符串并没有发生改变,返回的是新字符串
模式匹配(正则表达式)
RegExp用来创建表示文本匹配模式的对象
布尔值
undefined,null,0,-0,NaN,空字符串会被转化成false,其他值则是被转化为true,
null和undefined
null是js的关键字,表示空值,用typeof预算,得出的结果是object,他可以表示数字,字符串,对象是无值的
undefined表示未定义的值,返回undefined时表示这个属性或元素不存在,它和null不一样,不是js的关键字,只读,用typeof进行预算,得到的结果就是undefined,这个值是这个类型的唯一成员
两者要用严格相等运算符“===”进行区分,当要传入变量或参数时,用null更为合适
全局对象
包装对象
JavaScript对象是一种复合值,是属性和已命名值的集合,当属性值为函数时,称其为方法。
字符串有属性的原因是,当字符串引用了字符串的属性时,js就会调用new String()的方法转化为对象,属性引用结束后,自动销毁对象
同字符串一样,Number()Boolean()都会创造一个临时对象
不可变的原始值和可变的对象引用
JavaScript中的原始值,如undefined,null,布尔值,数字,字符串都是不可更改的,字符串的方法实际上时返回了一个新的字符串
对象和原始值不同,他们的值是可以改变的
原始值的比较为值的比较,对象的比较非值的比较,即使两个对象属性值完全一样,她们也是不相等的,各个索引和值完全相等的两个数组也不相等,当且仅当他们引用同一个对象时,他们才相等
所以进行对象和数组比较时,我们应该分别比较他们的属性和元素
类型转换
转换和相等性
返回值均为true
“===”运算符在判断相等时未作任何类型转换
显式类型转换
除了null和undefined之外的任何值都具有tostring()方法,和string()方法返回的一致,当null或undefined转化为对象时,会产生类型错误
tostring()方法可以将数字转化为其他进制数,例如var m = n.toString(8)转化为八进制数
Number()只适用于十进制进行转换,我们可以使用parseInt()和parseFloat(),例如
parseInt()还适用于指定数字要转换的进制
对象转换为原始值
tostring()方法
valueof()方法
如果是任意原始值,返回的值即为他的原始值
日期类的会返回从19701月1日到该时间的毫秒数
数组对象没有valueof()方法
js中从对象到字符串的转换
首先先使用tostring())方法,如果没有这个方法,就调用valueof()方法,如果两种方法都不能获得原始值的话,抛出类型异常
从对象到数字的转换
首先使用valueof()方法,返回一个数字,否则,调用tostring()方法,返回字符串,js将其转化为数字,如果两种方法都不行,则抛出类型异常
使用运算符对对象进行转换
变量作用域
全局变量拥有全局作用域,而在函数内声明的变量只在函数体内有定义,这是局部变量,作用域是局域性的,函数参数也是局部变量
在函数体内,函数内的局部变量优先于全局变量
在全局变量编写可以不使用var,但是再函数内部声明局部变量需要用var来定义,否则就会变成全局变量
函数作用域是可以嵌套的
函数作用域和声明提前
这段代码说明,函数内所有声明的变量都被提前至函数体的顶部,这被称作声明提前
就如这段代码输出的是undefined而不是global,这说明只有当函数指定到变量赋值的那一行时,变量才会被真正赋值
作为属性的变量
声明一个全局变量时,实际是顶一个全局对象的一个属性,当使用var定义时,这个变量无法通过delete删除,但是如果未用var定义的全局变量,是可以用delete删除的,例如
作用域链
作用域链是一个对象列表或链表,当js需要查找变量x的值时,会从链中依次寻找,如果不存在x,则会抛出引用错误异常
作用域上有两个对象,一个是全局对象,一个是定义函数参数和局部变量的对象,作用域链上至少有三个对象。
当定义一个函数时,实际保存一个作用域链,当调用这个函数时,它创建一个新的对象来存储他的局部变量。并将这个对象添加到作用域链上,同时创建一个新的更长的表示函数调用作用域的链