1.
语句是“做事情”;
var x;
if(y>=0){
x=y;
}else{
x=-y;
}
表达式是产生值;
var x = y>=0 ? y : -y;
2.
原始值:Number、String、Boolean、Undefined、Null
(1)原始值按值比较:
'abc'==='abc'; //true
(2)原始值的属性不能被改变、添加或移除:
var str='abc';
str.length=1;
console.log(str.length);//3
所有非原始值都是对象;
(1)对象按引用比较:比较身份标识,每个值都有各自的身份标识
{}==={};//false
var obj1={};
var obj2=obj1;
obj2===obj1;//true
(2)对象属性可以改变添加移除;
3.typeof 主要用于原始值 ,instanceof 主要用于对象
typeof null;// object 是一个不能去修正的bug,但这并不能表示null是一个对象
[] instanceof Object;//true
[] instanceof Array;//true
null instanceof Object;// false
4.
undefined,null,false,-0,NaN,''都会被解释成false,其他都是true
短路原则:&& ||
5.JavaScript中所有的数字都是浮点数
1===1.00;//true
'this\'s my pc'; //"this's my pc"
6.switch 匹配===
7.
函数声明具有提升特性:
function foo(){
bar();//ok
function bar(){
//...
}
}
function foo(){
bar();// not ok!!! //var声明也具有提升的特性,但是通过var执行的赋值却不具备该特性
var bar=function(){
//...
}
}
8.arguments 类似数组,但是不具备数组的方法
参数太多(多的参数被忽略)或太少(用undefined 补齐)
function f(x,y){
console.log(x,y);
return toArray(arguments);
}
function toArray(likearr){//将arguments转换为数组
return [...likearr];
// 或 return Array.prototype.slice.call(likearr);
}
f(1,2,3)// 1,2 [1,2,3]
f(1);//1,undefined [1]
9.所有的变量声明都会被提升,声明会被移动到函数的开始处,而赋值仍然会在原来的位置进行。
function foo(){
console.log(a);//undefined
if(false){
var a=1;
}
}
上述函数的执行过程:
function foo(){
var a;
console.log(a);
if(false){
a=1;
}
}
10.闭包
每个函数都和他周围的变量保持着连接,哪怕他离开被创建是的作用域也是如此
函数以及他所连接的周围作用域中的变量即为闭包;
function a(i){
return function (){
i++;
return i;
}
}
var inc=a(5);
inc();//6
inc();//7
inc();//8
11.
立即调用函数表达式IIFE可以将函数当做类似块的方式来使用
(function (){
var a=...;
}())
闭包会持续的保持与外部变量的连接;
var res=[];
for(var i=0;i<5;i++){
res.push(function (){return i;})
}
res[1]();//5 not 1
res[3]();//5 not 3
使用IIFE:
var res=[];
for(var i=0;i<5;i++){
(function(){
var j=i
res.push(function (){return j;})
}())
};
12.用in运算符检查对象属性是否存在;用delete运算符移除属性
var obj={
name:"jane",
age:123,
fun:function (){
return `my name is ${this.name}`
}
}
'name' in obj;//true
obj.fun();//"my name is jane"
delete obj.age;
[]获取属性值: obj['name'];//jane
将方法提取出来:
var func=obj.fun.bind(obj);
func();//"my name is jane"
13.方法中的函数,this问题:
var obj={
name:'jane',
friends;['a','b'],
fun:function (){
'use strict';
var that=this;
this.friends.forEach(function (friend){
console.log(that.name+'say hi to'+friend;
});
}
}
或:
var obj={
name:'jane',
friends;['a','b'],
fun:function (){
'use strict';
this.friends.forEach(function (friend){
console.log(that.name+'say hi to'+friend;
},this);
}
}
14.构造函数:对象工厂
function Point(x,y){
this.x=x;
this.y=y;
}
Point.prototype.fun=function (){
return (this.x*this.x+this.y*this.y)
}
var p=new Point(1,2);
p.fun();//5
15.
in 操作符也可以在数组中正常使用:
var arr=['a','b'];
1 in arr;//true
4 in arr;//false
数组是对象,所以可以拥有对象属性:
var arr=[];
arr.foo=23;
console.log(arr.foo);//23
arr.slice(1,2);//复制从下标1开始到2之前
遍历数组:
(1)forEach:
['a','b','c'].forEach(
(item,index)=>{
console.log(index+'.'+item);
}
)
(2)map:
[1,2,3].map(
function (x){return x*x;}
);
16.
/^a+b+$/.test("aaab");//true
/a(b+)a/.exec('_abbba_aba');//["abbba", "bbb"]
'<a> <bbb>'.replace(/<(.*?)>/g,'[$1]');//'[a] [bbb]'
17.
Math.abs(-2);//2
Math.pow(3,2);//9
18.eval 返回对象要加()
eval('{foo:123}');//123
eval('({foo:123})');//{foo:123}
19.控制流语句的主体只有一条语句:
if(obj!==null) obj.foo();
while(x>0) x--;
深入理解JavaScript重难点
最新推荐文章于 2022-10-30 21:45:02 发布