1 浮点数
0.3-0.2 == 0.2-0.1 //false
0.6-0.5 ==0.3-0.2 //true
所以说0.3-0.2 == 0.5-0.4 ==0.6-0.5 ==0.7-0.6
其他的各不相等
2
in 函数为判定索引 或者key值 一般是先隐式转换为 string类型 然后判定
但是 + 会默认将数字变为字符串链接 所以“2”+“1” ==“21”
但是你如果用减法 “2”-“1” ==1
那么1 in data 就会返回 true
3
变量声明与函数是否执行无关
这里成哥应该是搞错了 && 两个相同的非空值 应该是执行 最后一个表达式
4作用域链
[[scope]] 作用域储存执行期上下文集合
简单点说就是单独提供给内核使用的 一个控制函数的作用范围的指针或者说域
程序员无法调用
子集函数在执行时的作用域会调用父级函数的预编译结果
这就是产生作用域的原理
有点像存钱罐 放进去以后无法拿出来 但是存钱罐可以接收外面的钱
5 闭包
闭包就是当内部函数被保存到外部的时候,造成原作用域不释放,从而引发内存泄漏(内存占用)
function a(){
var i = 1;
function b(){
i++;
console.log('这样就是闭包');
console.log("函数在执行以后 " + i +" 会变成2")
}
}
闭包作用有 1 累加器 封装一个函数来实现累加 由于该函数比较自闭 所以可以用作累加
2 缓存 一个函数下的两个的不同函数公用一个AO,因此在增删的时候对该AO操作会保存 ,利用这一点实现累加器
3封装 公司开发的时候会产生大量的变量 累加可以防止 变量污染 利用的原理是闭包的私有化
6立即执行函数
这个算是闭包的一个非常常见的方法
(function(形参a,b,c){return 可以在函数执行之后销毁函数,只返回执行结果}(对应的实参))
可以定义一个变量来接收 函数的执行结果。
当该函数被立即执行以后 接收变量不再代表函数 而代表函数的执行结果
- / - / ! / || function 被忽略的名称(){}();都可以是立即执行函数,但是不推荐这样写
当函数执行完毕之后再访问函数返回值,会只有最终的结果
7 关于js对象类型的判定
首先可以使用 typeof 的方法
共有有六种返回值:string;boolean;number;Object,functionl;undefined
其次可以使用 instanceof 的方法
A instanceof B
A的原型链是否有B的构造函数
然后可以使用constructor
直接调用该属性
A.constructor
最后一种 obj.prototype.toString.call()的方法
function TypeOf(obj){
var type = Object.prototype.toString.call(obj);
if(type == '[object Array]'){
return 'Array';
}else if(type == '[object Object]'){
return "Object"
}else{
return 'param is no object type';
}
}
8 有关数组
首先可以改变数组本身的方法有
push()在数组的末尾增加一个或多个元素 并返回之后数组的长度
pop()删除并返回数组的最后一位
shift()删除并返回数组的第一位
unshift()在开头添加一个或多个参数,并返回数组的长度
sort(function(a,b){
return a-b;
})正向排序(升序如果return b-a则是降序)
reverse()逆转
splice()三个参数 (从哪儿切,切几个,加什么)这个貌似可以代替前面四个函数,还有多的用途
不改变原数组的方法
concat()连接
toString()转换为数组
join()连接以某某字符串的方式进行连接 成为字符串,当然也可以直接加数字,但是不推荐‘0’以0
为间隔连接,不传“”时按照,进行连接 有空串则按照字符串拼接形式连接
与之相反的有split()方法,按照参数的形式进行拆分,并组成数组
slice()(从哪儿切,切到什么位置)需要接收数据,不然没用