严格模式
在es5引入 为了让团队开发更为便利 严谨
- 变量必须在声明之后才能使用
"use strict"
a=1;
console.log(a);
结果会直接报错
- 函数的参数不能同名
"use strict"
function f(a,a,b) {
}
结果会直接报错
- 不能对只读的属性赋值 否则会报错
"use strict";
var str ="123";
str.length =1;//可读不可写
console.log(str.length)
- 不能删除不可删除的属性 否则会报错
"use strict";
delete str.length;//不可删除
console.log(str.length);
- delete 只能删除属性 不能删除变量
var str ="123";
delete str;
console.log(str);
- 不能使用前缀0表示八进制 否则会报错
var num =076;
console.log(num);
结果是62 加严格模式报错 在ES6中 8进制的前导值变为0o
var num =0x21;
console.log(num);
16进制表示方法 33
var num =0b1001;
console.log(num);
2进制表示方法 9
如果要进制转换怎么办
var num =0b1001;
console.log(num.toString(8));
将二进制转换为8进制 用toString
- eval 和arguments不能被重新赋值
function add() {
arguments = 3;
console.log(arguments);
}
add(1,2,3);
结果变为3 不合适 在严格模式下会报错
- 不能使用arguments.callee
- 不能使用arguments.callee.caller 函数的调用栈(谁调用这个函数 全局当中调用 caller是null)
function add() {
b();
}
function b(){
console.log(arguments.callee.caller);
}
add(1,2,3);
结果是 add caller就是谁调用b指向谁
- 禁止this 指向全局对象
- 增加了保留字 如protected static interface
使用严格模式需要注意什么
- 禁止在全局使用严格模式 有些浏览器不支持严格模式 有些代码也必须在非严格模式下书写 使用时应该在函数内部书写
function fn() {
"use strict";
}
use strict也有作用域之分
- 如果希望在多个函数使用 但是不想多次写use strict
(function () {
"use strict";
function fn(){
}
function fn2(){
}
})();
数组排序
- 判断是否时数组 Array.isArray()
function add() {
console.log(Array.isArray(arguments));
}
add(1,2,3);
结果是false
function add() {
var arr =[];
for (var i=0;i<arguments.length;i++){//arguments有length属性
arr[i] = arguments[i];
}
console.log(arr)
}
add(1,2,3);
将123保存进去并打印
function add() {
var arr = [].slice.call(arguments, 0);//改变了指向 指向arguments
console.log(arr)
};
在argument当中 长的像数组的只有123 下面是劫不出来 这就是js的灵活地方
- 颠倒数组用reverse
var arr =[1,2,3];
arr.reverse();
console.log(arr);
结果是【3,2,1】
- 数组排序 sort() 按照ASCII排序 unicode码点进行排序 从小到达排 会改变原数组
var arr =[156,14,21,2];
console.log(arr.sort())
结果是[14, 156, 2, 21]
var arr =["lisi","wangwu","zhaoliu","qianqi"];
console.log(arr.sort())
["lisi", "qianqi", "wangwu", "zhaoliu"]先比较字符串的第一位
自定义排序
- 回调函数 参数作为一个函数体 在方法执行的时候 函数执行
var arr =[156,14,21,2];
arr.sort(function (a,b) {//每次都接受两个值 当前值和下一个值
return a-b;//性能很低
})
console.log(arr);
结果是[2, 14, 21, 156] 如果a-b>0,表示a>b 交换位置 如果a-b<0,表示a<b 不交换位置 如果a-b=0, 不交换位置
- 大到小排序
var arr =[156,14,21,2];
arr.sort(function (a,b) {//每次都接受两个值 当前值和下一个值
return b-a;//性能很低
})
console.log(arr);
遍历数组的方法
- filter 过滤器 不改变原数组 返回一个新数组 参数是一个函数 通过自定义的过滤方法返回新的数组
var arr =[12,5,8,123,222];
var arr1 = arr.filter(function () {
return true;
})
console.log(arr1);
[12, 5, 8, 123, 222] 返回原数组 就是返回值是true就返回该数值
var arr =[12,5,8,123,222];
var arr1 = arr.filter(function () {
console.log(arguments);
})
console.log(arr1);
里面的arguments 第一个是数组的一个值 第二个是索引 第三个是数组本身
var arr =[12,5,8,123,222];
var arr1 = arr.filter(function (item) {
return item>12;//表示每次循环我都判断第一个值是不是大于12 将大于的值给arr1
})
console.log(arr1);
结果是 123 222
var stu=[//想要找到大于20的放入新的数组
{name:"lisi",age:"20"},
{name:"lily",age:"18"},
{name:"lucy",age:"22"},
{name:"hmm",age:"30"},
]
var stu1 = stu.filter(function (item) {
return item.age>20;
})
console.log(stu1);
结果是0: {name: "lucy", age: "22"}1: {name: "hmm", age: "30"}length: 2__proto__: Array(0)
- map遍历数组 由回调执处理之后的一个新的返回值组成的数组
var arr =[1,4,9];
var num =[];
for (var i=0;i<3;i++){
num[i] = Math.sqrt(arr[i]);//将数组中的值开平方
}
console.log(num)
结果是123
var arr =[1,4,9];
var num = arr.map(Math.sqrt);
console.log(num);
- forEach 通过回调处理数组中的所有参数 没有返回值 就是每走一步执行一个函数 没有改变原数组
var arr =[1,4,9];
arr.forEach(function (item,index,array) {
console.log(`a[${index}]=${item}`);//结果是a[0]=1 a[1]=4 a[2]=9
})
console.log(arr);//【1,4,9】
- every所有为真则为真 some有一个为真则为真 针对所有回调函数的返回值 如果全为true 最终结果为true
var arr = [1,2,3,4]//如果所有的数为偶数则返回true
var bool = arr.every(function (item) {
return item%2 ==0;//接受布尔值为返回值 如果全是true 那么最终结果是true
})
console.log(bool)
结果是false
数组去重
var arr =["lisi","lucy","lily","hmm","lisi","hmm"]//将数组中重复的单元去除
var arr1 = arr.filter(function (item,index,array) {
return array.indexOf(item) === index;//如果是true 返回当前元素
})
- for循环做数组去重
严格模式
在es5引入 为了让团队开发更为便利 严谨
- 变量必须在声明之后才能使用
"use strict"
a=1;
console.log(a);
结果会直接报错
- 函数的参数不能同名
"use strict"
function f(a,a,b) {
}
结果会直接报错
- 不能对只读的属性赋值 否则会报错
"use strict";
var str ="123";
str.length =1;//可读不可写
console.log(str.length)
- 不能删除不可删除的属性 否则会报错
"use strict";
delete str.length;//不可删除
console.log(str.length);
- delete 只能删除属性 不能删除变量
var str ="123";
delete str;
console.log(str);
- 不能使用前缀0表示八进制 否则会报错
var num =076;
console.log(num);
结果是62 加严格模式报错 在ES6中 8进制的前导值变为0o
var num =0x21;
console.log(num);
16进制表示方法 33
var num =0b1001;
console.log(num);
2进制表示方法 9
如果要进制转换怎么办
var num =0b1001;
console.log(num.toString(8));
将二进制转换为8进制 用toString
- eval 和arguments不能被重新赋值
function add() {
arguments = 3;
console.log(arguments);
}
add(1,2,3);
结果变为3 不合适 在严格模式下会报错
- 不能使用arguments.callee
- 不能使用arguments.callee.caller 函数的调用栈(谁调用这个函数 全局当中调用 caller是null)
function add() {
b();
}
function b(){
console.log(arguments.callee.caller);
}
add(1,2,3);
结果是 add caller就是谁调用b指向谁
- 禁止this 指向全局对象
- 增加了保留字 如protected static interface
使用严格模式需要注意什么
- 禁止在全局使用严格模式 有些浏览器不支持严格模式 有些代码也必须在非严格模式下书写 使用时应该在函数内部书写
function fn() {
"use strict";
}
use strict也有作用域之分
- 如果希望在多个函数使用 但是不想多次写use strict
(function () {
"use strict";
function fn(){
}
function fn2(){
}
})();
数组排序
- 判断是否时数组 Array.isArray()
function add() {
console.log(Array.isArray(arguments));
}
add(1,2,3);
结果是false
function add() {
var arr =[];
for (var i=0;i<arguments.length;i++){//arguments有length属性
arr[i] = arguments[i];
}
console.log(arr)
}
add(1,2,3);
将123保存进去并打印
function add() {
var arr = [].slice.call(arguments, 0);//改变了指向 指向arguments
console.log(arr)
};
在argument当中 长的像数组的只有123 下面是劫不出来 这就是js的灵活地方
- 颠倒数组用reverse
var arr =[1,2,3];
arr.reverse();
console.log(arr);
结果是【3,2,1】
- 数组排序 sort() 按照ASCII排序 unicode码点进行排序 从小到达排 会改变原数组
var arr =[156,14,21,2];
console.log(arr.sort())
结果是[14, 156, 2, 21]
var arr =["lisi","wangwu","zhaoliu","qianqi"];
console.log(arr.sort())
["lisi", "qianqi", "wangwu", "zhaoliu"]先比较字符串的第一位
自定义排序
- 回调函数 参数作为一个函数体 在方法执行的时候 函数执行
var arr =[156,14,21,2];
arr.sort(function (a,b) {//每次都接受两个值 当前值和下一个值
return a-b;//性能很低
})
console.log(arr);
结果是[2, 14, 21, 156] 如果a-b>0,表示a>b 交换位置 如果a-b<0,表示a<b 不交换位置 如果a-b=0, 不交换位置
- 大到小排序
var arr =[156,14,21,2];
arr.sort(function (a,b) {//每次都接受两个值 当前值和下一个值
return b-a;//性能很低
})
console.log(arr);
遍历数组的方法
- filter 过滤器 不改变原数组 返回一个新数组 参数是一个函数 通过自定义的过滤方法返回新的数组
var arr =[12,5,8,123,222];
var arr1 = arr.filter(function () {
return true;
})
console.log(arr1);
[12, 5, 8, 123, 222] 返回原数组 就是返回值是true就返回该数值
var arr =[12,5,8,123,222];
var arr1 = arr.filter(function () {
console.log(arguments);
})
console.log(arr1);
里面的arguments 第一个是数组的一个值 第二个是索引 第三个是数组本身
var arr =[12,5,8,123,222];
var arr1 = arr.filter(function (item) {
return item>12;//表示每次循环我都判断第一个值是不是大于12 将大于的值给arr1
})
console.log(arr1);
结果是 123 222
var stu=[//想要找到大于20的放入新的数组
{name:"lisi",age:"20"},
{name:"lily",age:"18"},
{name:"lucy",age:"22"},
{name:"hmm",age:"30"},
]
var stu1 = stu.filter(function (item) {
return item.age>20;
})
console.log(stu1);
结果是0: {name: "lucy", age: "22"}1: {name: "hmm", age: "30"}length: 2__proto__: Array(0)
- map遍历数组 由回调执处理之后的一个新的返回值组成的数组
var arr =[1,4,9];
var num =[];
for (var i=0;i<3;i++){
num[i] = Math.sqrt(arr[i]);//将数组中的值开平方
}
console.log(num)
结果是123
var arr =[1,4,9];
var num = arr.map(Math.sqrt);
console.log(num);
- forEach 通过回调处理数组中的所有参数 没有返回值 就是每走一步执行一个函数 没有改变原数组
var arr =[1,4,9];
arr.forEach(function (item,index,array) {
console.log(`a[${index}]=${item}`);//结果是a[0]=1 a[1]=4 a[2]=9
})
console.log(arr);//【1,4,9】
- every所有为真则为真 some有一个为真则为真 针对所有回调函数的返回值 如果全为true 最终结果为true
var arr = [1,2,3,4]//如果所有的数为偶数则返回true
var bool = arr.every(function (item) {
return item%2 ==0;//接受布尔值为返回值 如果全是true 那么最终结果是true
})
console.log(bool)
结果是false
数组去重
var arr =["lisi","lucy","lily","hmm","lisi","hmm"]//将数组中重复的单元去除
var arr1 = arr.filter(function (item,index,array) {
return array.indexOf(item) === index;//如果是true 返回当前元素
})
- for循环做数组去重