严格模式:
在全局或函数的第一条语句定义为:'use strict';
<script type="text/javascript">
'use strict';
</script>
语法和行为的改变:
必须用var声明变量
var username = 'kobe';
console.log(username);
禁止自定义的函数中的this指向window
function Person(name,age) {
this.name = name;
this.age = age;
}
new Person('kobe',40);
创建eval作用域
var str = 'NBA';
eval('alert(str)');//alert直接被调用 能够解析传进来的字符串 如果是JS代码是能够执行的
eval('var str = "CBA";alert(str)');//使用严格模式 //不会污染全局的str
alert(str);//不使用严格模式的话 打印的都是cba //eval没有自己的作用域
对象不能有重名的属性
var obj = {
username: 'kobe',
//username: 'wade' 属性不能重名
}
JSON对象:
1.JSON.stringify(对象或数组)js对象(数组)转换为json对象(数组)
var obj = {username:'kobe'};
obj = JSON.stringify(obj);//js传换成json
2.JSON.parse(对象或数组)json对象(数组)转换为js对象(数组)
obj = JSON.parse(obj);//json转换js
Object扩展:
1.Object.create(prototype,[descriptors])
以指定对象为原型创建新的对象
为新的对象指定新的属性,并对属性进行描述
value:指定值
writable:标识当前属性值是否是可修改的,默认为false
configurable:标识当前属性是否可以被删除 默认为false
enumerable:标识当前属性是否能用 for in 枚举 默认为false
var obj = {username:'jordan',age: 55};
var obj1 = {};
obj1 = Object.create(obj,{
sex: {
value:'男',
writable: true,//默认为false不能修改 我们把它改为true
configurable:true,//默认为false不能删除 我们把它改为true
enumerable:true//默认为false不能枚举 我们把它改为true
}
}); //还可以添加配置对象,扩展属性
console.log(obj1);//打印结果为Object展开后下边有一个隐式原型__proto__: age:55 username:"jordan",也是一个对象
obj1.sex = '女';//修改属性
delete obj1.sex;//删除属性
console.log(obj1.sex);//可以直接调用
for(var i in obj1){
console.log(i);
}//并没有把sex枚举出来,然后在create方法中把enumerabler属性改为true;
2.Object.defineProperties(object,descriptors)
为指定对象定义扩展多个属性
get:用来获取当前属性值的回调函数
set:修改当前属性值的触发的回调函数,并且实参即为修改后的值
存取器属性:setter,getter一个用来存值,一个用来取值
var obj2 = {firstName:'kobe',lastName:'bryant'};
Object.defineProperties(obj2,{//扩展属性
fullName:{//添加配置对象
get:function () {//获取扩展属性的值
return this.firstName + " " + this.lastName;
},//相关描述和配置
set:function (data) {//监听扩展属性,当属性发生变化,会自动调用
//将变化的值作为实参传入
console.log('set()',data);
var names = data.split(" ");
this.firstName = names[0];
this.lastName = names[1];
}
}
});
console.log(obj2);
var obj3 = {
firstName:'stephen',
lastName:'curry',
get fullName(){
return this.firstName + " " + this.lastName;
},
set fullName(data){
var names = data.split(" ");
this.firstName = names[0];
this.lastName = names[1];
}
};
Array扩展:
1.Array.prototype.indexOf(value):得到值在数组中的第一个下标
var arr = [2,4,6,6,2,3,1];
console.log(arr.indexOf(2));//查看2出现第一次的下标
2.Array.prototype.lastIndexOf(value):得到值在数组中的最后一个下标
console.log(arr.lastIndexOf(2));//查看2出现最后一次的下标
3.Array.prototype.forEach(function(item,index){}):遍历数组
arr.forEach(function (item,index) {
console.log(item,index)
});//遍历元素和对应的下标
4.Array.prototype.map(function(item,index){}):
遍历数组返回一个新的数组,返回加工之后的值
var arr1 = arr.map(function (item,index) {
return item + 10;
});
console.log(arr1);
5.Array.prototype.filter(function(item,index){}):
遍历过滤出一个新的子数组,返回条件为true的值
var arr2 = arr.filter(function (item,index) {
return item > 3;//返回大于三的新数组
});
console.log(arr,arr2);
Function扩展:
1.Function.prototype.bind(obj):
将函数内的this绑定为obj,并将函数返回
var obj = {username: 'kobe'};
function foo(data) {
console.log(this,data);
}
foo.call(obj,33);
foo.apply(obj,[33]);
foo.bind(obj,33)();
2.bind()与call()和apply()的区别:
都能指定函数中的this
call()/apply()是立即调用函数
bind()是将函数返回
let关键字:
1.作用:与var类似,用于声明一个变量
let username = 'kobe';
//不能重复声明,会报错
for(let i = 0; i<btns.length;i++){//使用let取下标
var btn = btns[i];
btn.oncilck = function () {
alert(i)
}
}
2.特点:在块作用域内有效,不能重复声明,不会提前预解析
3.应用:循环遍历加监听,取代var是趋势
const关键字:
1.作用:定义一个常量
const KEY = 'NBA';
2.特点:不能修改,其他特点同let
3.应用:保存不能改变的数据
变量的解构赋值:
1.从对象或数组中提取数据,并赋值给多个变量
2.对象的解构赋值:let {n,a} = {n:'tom',a:12}
let obj = {username:'kobe',age:40};
let {username,age} = obj;//等于let username = obj.username; let age = obj.age;
//要求:对象必须是以有属性
3.数组的解构赋值:let [a,b] = [1,'hello']
let arr = [1,3,5,'abc,true'];
let [a,b,c,d,e] = arr;//分别取到五个值
let [a,b] = arr;//根据下标位置取
let [,,a,b] = arr;//逗号占位,取到5,abc
4.用途:给多个形参赋值
模板字符串:
1.简化字符串的拼接,使用``包含,变化的部分使用${xxx}定义
let obj = {username:'kobe',age:40};
let str = `我的名字叫:${obj.username},我的年龄:${obj.age}`;
console.log(str);
简化的对象写法:
1.省略同名的属性值,省略方法的function
let username = 'kobe'
let age = 40;
let obj = {
username,
age,
getName() {
return this.username;
}
}
箭头函数:
作用,定义匿名函数:() => console.log('xxx')
一个参数:i => i + 2
大于一个参数:(i,j) => i+j
函数体不能用大括号:默认返回结果
函数体如果有多个语句,需要用{}包围,需要手动返回
用来定义回调函数
let fun = () => console.log('箭头函数');
fun();
//没有形参的时候括号不能省略
let fun1 = () => console.log('箭头函数');
//只有一个形参可以省略括号
let fun2 = (a) => console.log(a);
//两个以上的时候 不能省略括号
let fun3 = (x,y) => console.log(x,y);
//函数体只有一条语句或表达式{}可以省略 会自动返回执行结果
let fun4 = (x,y) => x + y;
console.log(fun4(24.23));
//函数体不止一条语句,手动返回结果
let fun5 = (x,y) => {
console.log(x,y);
return x + y;
}
3点运算符:
rest参数: 用来取代arguments 只能在形参最后使用
function foo(...value) {
console.log(arguments)
}
foo(2,3,4,5);
let arr = [1,6];
let arr2 = [2,3,4,5];
arr = [1,...arr1,6];//把arr2插入到arr中