平安提防机制
未声明变量undeclared
、声明未初始化变量undefined
var a
b
typeof a //"undefined"
typeof b //"undefined"
运用typeof
来做平安提防机制可以防备报错
if(typeof r !== 'undefined'){
//do
}
else{
//do
}
数组
数组可以包容任何范例的值。
用delete
删除数组的某一项值后,数组长度不会转变
var a = [1,2,3]
delete a[1]
console.log(a.length)
//3
建立“稀松”数组(含有空白或空白的数组)后,个中空白单位值为undefined
,与将其显现赋值为undefined有辨别
数组经由过程数字举行索引,但它也是对象,可以包括字符串键值和属性,然则这些并不盘算在数组长度内
var c = []
c[0] = 1
c ["dd"] = 2
console.log(c.length) // 1
注重:假如字符串值可以被强迫转换为十进制数字的话,它就可以被看成数字索引来处置惩罚
var d = []
b[0] = 1
b["13"] = 12
console.log(b) // [1, 13: 12]0: 1 13: 12length: 14
类数组
将类数组转化成真数组,运用数组东西函数indexOf() concat() forEach() slice().经由过程arguments对象将函数的参数看成列表来访问在ES6中已烧毁
Array.form(arguemnts)
完成返回参数列表的数组复本
字符串
js中字符串是不可变的,而(字符)数组是可变的。
字符串稳定指的是字符串成员函数不会转变其原始值,而建立并返回一个新的字符串。而数组成员都是在其原始值上举行操纵。
var m = "foo"
var n = ['f','o','o']
m[1] = 1
n[1] = 1
console.log(m,n) // foo ["f", 1, "o"]
c = m.toUpperCase()
m === c //false
m //"foo"
c //"FOO"
很多数组函数用来处置惩罚字符串很轻易,虽然字符串没有这些函数,但可以经由过程“借用”数组的非变动要领
来处置惩罚字符串
一般要领:
Array.prototype.join.call()
字符串反转:
不能经由过程Aarry.prototype.reverse.call()来“借用”可变动成员函数reverse()
简朴字符串反转经常使用要领:
var c = "foo"
c
//将字符串转成字符数组
.split("")
.reverse()
//将字符数组转成字符串
.join("") //"o,o,f"
数字
js没有真正意义上的“整数”,js中数据范例基于IEEE754规范完成的,该规范一般也被称为”浮点数“。
较小的数值
如何来推断0.1 + 0.2 == 0.3是不是相称呢?
设置一个偏差局限值,
ES6中定义Number.EPSILON
为ES6写的polyfill
if(!Number.EPSILON){
Number.EPSILON = Math.pow(2,-52)
}
可以运用Number.EPSILON来比较两个数字是不是相称(即在指定偏差内)
搜检一个数是不是为整数
ES6:Number.isInterger
polyfill
if(!Number.isInteger){
Number.ismteger = function(num){
return typeof num == 'number' && num % 1 == 0
}
}
搜检是不是为一个平安的整数
polyfill
if(!Number.isSafeInteger){
Number.isSafeInteger = function)(num){
return Number.isInteger(num) && Math.abs(num) <= Num.MAX_SAFE_INTEGER
}
}
32位有标记整数
整数最大可以到达53位,有些数字操纵实用32位数字。a | 0
可以将变量转换成32位有标记的整数,由于整数运算符|
只实用32位整数。因而与0举行操纵即可截取a中的32位数位。
特别数值
undefined
null
:既是范例也是值
null
空值,特别关键字,指曾赋过值,然则现在没有值
undefined
标志符,没有值,未赋值
NaN
不是数字的数字(没法剖析为通例十进制/十六进制)
var a = 2/"foo" //NaN
typeof a //"number"
自反的值 NaN !== NaN
isNaN()
:搜检参数是不是不是NaN,也不是数字
var a = 2/"foo"
var b = "foo"
window.isNaN(b) //true
window.isNaN(a) //true
ES6:Number.isNaN
polyfill:
if(!Number.isNaN){
Number.isNaN = function(num){
return num !== num
}
}
无限数
var a = -1 / 0 //-Infinity
var b = 1 / 0 //Infinity
var c = 1 / Infinity //0
var d = -1 / Infinity //-0
var e = Infinity / Infinity // NaN
零值
0
和-0
var a = 0 / -3 //-0
var b = 0 * -3 //-0
加法和减法运算得不到-0
要辨别0和-0
function isNegZero (n) {
n = Number(n)
return (n===0) && (1/n === -Infinity)
}
特别等式
ES6: Object.is(..)
polyfill
if(!Object.is){
Object.is = function (v1,v2) {
if(v1 === 0 && v2 === 0 ){
return 1 / v1 === 1 / v2
}
if(v1 !== v1){
return v2 !== v2
}
return v1 === v2
}
}
PS:数值斟酌NaN 与 0 -0
值和援用
js对值和援用的赋值在语法上没有辨别,完整依据值的范例
值复制:标量基础范例的值是不可变动的
null / undefined
字符串
数字 new Number()
boolean
symbol
援用复制:同时指向一个值,变动的也是同一个值
对象(数组和封装对象)
函数
假如经由过程值复制来通报复合值,就需要为其建立一个复本,如许通报的就不是原始值foo(a.slice())
相反,假如将标量基础范例值通报到函数并举行变动,就需要将该值封装到一个复合值中,然后经由过程援用复制举行通报
function foo(wrapper){
wrapper.a = 42
}
var obj = {
a : 2
}
foo(obj)
obj.a //42