typeof
typeof undefined//undefined
typeof b // undefined
typeof null//object
typeof string//string
typeof number//number
typeof NaN//number NaN 也属于 number 类型,并且 NaN 不等于自身。
typeof boolean//boolean
typeof function//function
typeof object//object
typeof name//string
toString()方法返回对象的字符串,valueOf()返回对象的原值,一般情况下,valueOf()的优先级高于toString(),在alert()中相反
类型转换
转换标准:
如果只有一个bool,转化成number;
如果一个number一个string,string转化成number;
如果一个对象,优先调用valueOf()方法,没有调用toString()转化成'[Object 真实类型]'或’字符串‘,再根据上述两个方法再转化
对象之间不相等(最相等运算时比较的是值,指针存储的是对象的内存地址,不同对象即使内容相同但是开辟内存空间不同地址也就不同,所以不等)
1、boolean([])==true//true
首先[]是对象object,调用toString()为'[Object array]'转bool为true
2、[]==![]//true
[]转换成数字为0
!进行bool判断,优先将【】转换为bool类型为true,!true为false,false转化为数字为0
3、NAN!==NAN//true
包装对象
存取字符串、数字或bool值得属性创建的临时对象成为包装对象
可以通过string、Number()、Boolean()来显示创建包装对象
new String("a")
new Number(1)
new Boolean(false)
函数形参
函数形参列表在ECMAscript内部是用数组装的,浏览器只关心数组而不关心数组内部元素,传递参数解构赋值对应相应的形参
可以通过arguments对象来遍历参数
函数作用域
var scope='global'
function a(){
console.log(scope)//undefined
var scope='local'
console.log(scope)//local
输出undefined是因为函数作用域的特性,函数体内局部变量的优先级高于同名全局变量,函数体内局部变量覆盖同名全局变量并将该变量提升,初始化留在原先位置
var scope='global'
function a(){
var scope
console.log(scope)//undefined
scope='local'
console.log(scope)//local
变量的生命周期
全局变量的生命周期永久除非主动销毁该变量
局部变量在函数调用结束后立刻销毁
通过闭包可以不让将局部保量保存不立刻被销毁
变量作用域
函数体内的局部变量用var声明且只能在函数体内访问得到,函数体内变量可以访问函数体外部的变量(随着作用域链逐级向上查找),但是函数体外部变量无法访问内部变量
立即执行函数(IIFE)以及声明函数区别
立即执行函数将匿名函数包裹在一对圆括号中(),例如
for(var i= 0; i < 10 ; i++){
var a=(function(e){
console.log(e)
})(i)
}
声明函数
for(var i= 0; i < 10 ; i++){
var a=function(e){
console.log(e)
}
a(i)
}
位运算符:https://blog.youkuaiyun.com/qq_41218152/article/details/81562202
与运算符&:相应位操作数都为1,则为1
或运算符||:相应位操作数有一个1或都是1,则为1
非运算符~:操作数所有位取反
异或运算符^:相应位操作数只有一个1,则为1
左移运算符<<:左移1位相当于乘以2,左移两位相当于乘以4,依次类推
右移运算符>>:左移1位相当于除以2,左移两位相当于除以4,向下取整,依次类推
无符号右移>>>:左边高位总是被0填补
负数计算方法:
例如-1
先求1的二进制(32位补齐):0000 0000 0000 0000 0000 0000 0000 0001
再按位取反: 1111 1111 1111 1111 1111 1111 1111 1110
再加1: 1111 1111 1111 1111 1111 1111 1111 1111
也就是0xFFFFFFFF
eval()函数
只接收一个参数
不是字符串直接返回该参数
是字符串将其按照js代码进行编译,并可以更改局部变量给其重新赋值;
如果在代码最顶层使用了eval()或别名指代它,将作用于全局变量和局部变量
ReferenceError、SyntaxError
ReferenceError(引用错误):非法或不能识别的引用数值
例如:console.log(a)//查找上下文未发现a,报Uncaught ReferenceError:a is not defined
SyntaxError(语法错误)
例如:var a=function(){
}
return a;//return在函数体内起作用,写在全局内是不允许的,报SyntaxError错误
对象属性
获取对象属性可以通过.或者["属性名"]的方式获取
如果属性名为js本身的类似于for、class等的保留字,只能通过[]的方式获取属性值
在js对象中可以创建多个属性,通过[]可以直接访问他们的属性但包含在[]内的字符串不需要为标识符而是使用类似数组的写法[]可以获取到
对象属性getter、setter
由getter和setter定义的属性为存取器属性
存取器属性都是成对定义的函数
定义函数不用function开头而是用get、set开头,并且函数名相同
存取器属性可继承
存取器内的getter、setter的this指向定义函数体时的父元素对象(默认将get、set函数当做对象方法调用)
//cunquqi是可读写的存取器属性
get cunquqi(){},
set cunquqi(newValue){}
[,,]
var a=[,,]//数组直接量允许有可选的逗号结尾,此时数组a内有两个元素
a[0]//undefined
a[1]//undefined
负数和非整数可以当作数组索引。
a[-1.23]=true//-1.23是索引值
a['1000']=0//这是数组的第1001个元素
数组元素删除
删除一个数组元素不会改变数组的length,也不会从高位向前填补删除位,删除位不存在变成稀疏数组
a=[1,2,3]
delete a[2]=>[1,2,,]
a.length//3
2 in a//false,省略掉的元素不存在
排除数组中null、undefined、不存在的元素
for(var i=0;i<a.length;a++){
if(!a[i]) continue;//排除null、undefined、不存在元素
if (a[i]===undefined) continue;//排除undefined元素
if(!(i in a)) continue;//排除不存在元素
}
常用数组方法:https://blog.youkuaiyun.com/qq_39132756/article/details/85007082
reduce()
reduce(function(pre,val,index,arr){
},init)
// pre 上次调用函数的返回值
// val 本次操作值
// inedx val索引值
// arr 当前数组
// init 初始值,首次调用传入值
var a = [1, 2, 3]
a.reduce((a, b) => {
console.log(a, b)
})
//首次传参,1 2
//pre为上次调用函数返回值,没有return值,就返回undefined, undefined 3