JavaScript类型值和变量

66 阅读6分钟

数字

算术运算

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,则会抛出引用错误异常

作用域上有两个对象,一个是全局对象,一个是定义函数参数和局部变量的对象,作用域链上至少有三个对象。

当定义一个函数时,实际保存一个作用域链,当调用这个函数时,它创建一个新的对象来存储他的局部变量。并将这个对象添加到作用域链上,同时创建一个新的更长的表示函数调用作用域的链