隐式类型转换
(加法运算)
任何内容和字符串链接—字符串
除了字符串,数字和其他相加----优先数字
数值和引用类型相加时,引用类型自动转换字符串
(减法运算)
引用类型转换数值时—转数值NaN
数组特殊,优先转换字符串,然后转换数值
obj → [object Object]
undefined → undefined
null → null
NaN → NaN
num → str
运算符
赋值时返回赋值结果
运算(不能超过2的31次幂)
(&&)当前面ture时返回后面结果,当前面false时返回前面结果。
(3&4)位于运算,结果为0(011&100=0)
(123123&0xFF)//不大于255的任何数值
(3|4)位或运算,结果为7(011|100=111)
(|0XFF)//不小于255
(3^ 4)异或运(0^0 = 0 0 ^ 1=1)结果为7(011异或100 =111=7)
异或可以加密
~ 位非运算 +1取负
用于取整(不处理小数,不能超过2的31次幂)
对于小数 向下取整 (比Math.floor好用)
特别的
~数组时,数组中 若只有单项元素且类型为数字或类数字(字符串内要为纯数字)
(即[1]或['1']) 时,arr转数字 然后+1取反
~其它的任何类型(当然除了str '1')
~非数字 == -1 () 包括null、undefined、NaN等
由上易得 ~~'a' = = 0
(1<<n)<<左移位 2的n次幂
(218>>1) >>右移位
低于加减运算
例(a+= 1? 1 : 2)=1 (三目运算优先+=运算)
布尔转换
所有引用类型转换成布尔类型转换成 true
===
undefined = = = undefined、null= ==null
但NaN!==NaN
判断一个值是否是NaN,只能用isNaN()来或者Objec.is()来比较
Object.is(Number(‘a’),NaN) nan是nan 所以返回true
引用类型 地址相同 则相同
==
如果两个值类型不同,他们也可能相等。根据下面规则进行类型转换再比较
// ""==fasle==0
如果两个值类型不同,他们也可能相等。根据下面规则进行类型转换再比较
undefined= =null 其它的4个空不可以
str==num 则str先变成num
true变1 false变0
如果一个是对象,另一个基本类型,把对象转换成基础类型的值再比较。
对象转换成基础类型,利用它的toString或者valueOf方法。
js核心内置类,会尝试valueOf先于toString;例外的是Date,Date利用的是toString转换。
object.is()//精确比较(可以比较NaN)
isNaN()自动隐式转换成数值类型,并且判断是不是nan
number.isNaN()不转换
number.isintegar()判断是否为整数
条件语句
if()
//表达式运算后隐式转换为布尔类型(优先转换)后判断是否为true,如果是true进入循环
undefined null “” false 0 nan
var o={ }
if(o){}表示不是 以上六种情况
var a=0 /或其它值
var b
if(a++){ b=3 }
这等价于
if(a===0){ a++;b=3 } else {a++}
循环语句
循环while()中“ , ”前不作为循环条件判断,只判断最后一个表达式是否为true
利用死循环解决问题,break
深度遍历,所使用的深度遍历的属性必须固定(适合链表linked)
可以使用break continue 完成跳转到外层label中
让s=从1加到100 *//5050*
var i=0,s=0;
while(s+=i,++i<=100);
// while(true) 判断在里 循环在外 (借助break)
var arr=[1,2,3,4]
while(true){
if(!arr.length) break
arr.pop();
}
对象
键值对 key value
一个键对应一个值
键必须是字符型或者symbol型,如果不是则隐式转换为字符串
键不能重复,重复就是覆盖
创建对象key
// s=a-1
// var obj={
// a
// [s]
// “a-1”
// }
任何对象转换成字符串时都会变成[ object object]
for in 使用for in自动转换成字符串,并且可以打印除所有外的其他属性
//不可遍历不可枚举属性
判断一个东西是不是数组
if(!array || array.constructor!==Array) throw new Error(array+“不是一个数组!”)
对象中属性的this指向当前对象外上下文环境中的this
var o={a:1,b:2}
o=null,清除引用类型
null用来在垃圾回收时,可以将不使用的引用类型回收掉
JSON.stringfy()对象转换字符串
函数
纯函数 独立个体,不会对函数外的变量和其他内容有影响(开发时应该尽量向纯函数靠拢,少跟外面联系)
局部变量,函数执行后会自动释放
同步
function fn(){
fn1
}
function fn1(){
fn2
}
function fn2(){
fn3
}用于异步处理
异步
var ef =new function(“”,“”,)字符串
//用于动态改变
// 用途是需要传字符串来写函数的时候
var a=1
{
a=2;
fn a(){}
a=3;
fn a(){}
a=4
console.log(a) *//4*
}
console.log(a) *//3*
再看一个
var a=1
{
a=2;
fn a(){}
a=3;
a=4
}
console.log(a) *//2*
同名函数在块内预解析预赋值的同时将,同名函数上的同名变量挤出快外赋值。
回调循环
setTimeout(fn,1000) 这是有返回值的 调用几次返回几 , 第二个参数不设置就会每帧走一遍
解耦
cleartimeout()防止内存泄漏
arguments.callee 指向当前函数
argmment.callee.caller执行该函数的上下文 执行环境函数
递归函数
尾递归(执行更快)后面没有语句
尾递归:函数体内 递归放在最后 性能好
非尾递归 一层一层返回时 后面还有代码 就麻烦
而尾递归 直接从最后一层调到最外层 √
作业.对象深比较
var len=object.keys(o)获取所有key
var values=object.values(o)获取所有key对应数组数值