深入理解JavaScript重难点

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--;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值