一、字符串扩展
includes() 返回布尔值,表示是否找到了参数字符串
startsWith() 返回布尔值,表示参数字符串是否在原字符串的头部。
endsWith() 返回布尔值,表示参数字符串是否在原字符串的尾部。
repeat(n) repeat方法返回一个新字符串,表示将原字符串重复n次。
let str = "Hello World!";
console.log(str.includes("llo"));
console.log(str.startsWith("Hello"));
console.log(str.endsWith("!"));
console.log(str.repeat(1));
padStart() 用于头部补全
padEnd() 用于尾部补全
let str = "5";
console.log(str.padStart(10, "abcde"))
console.log(str.padStart(10))
console.log(str.padStart(10, ""))
模板字符串
- 不是单引号或双引号,而是使用反引号
- 反引号里面引用的内容可以换行
- 如果需要引入变量,则变量的写法为${}
- ${}不会与jq内容混合
let person = "World";
let str = `Hello ${person}!`;
console.log(str)
let str = `
`
console.log(str);
标签模板
console.log`123`;
二、数值的扩展
Number.isFinite() 用来检查一个数值是否为有限的(finite)
console.log(Number.isFinite(15)) //true
console.log(Number.isFinite(0.8)) //true
console.log(Number.isFinite(NaN)) //false
console.log(Number.isFinite(Infinity)) //false
console.log(Number.isFinite(-Infinity)) //false
console.log(Number.isFinite('foo')) //false
console.log(Number.isFinite('15')) //false
console.log(Number.isFinite(true)) //false
console.log(Number.isFinite(1/3)) //true
Number.isNaN() 用来检查一个数值是否为NaN
Number.isNaN(NaN); //true
Number.isNaN(Number.NaN); //true
Number.isNaN(0/0); //true
//下面这几个如果使用全局的isNaN()时,会返回true
Number.isNaN("NaN"); //false,字符串"NaN"不会被隐式转换成数字NaN。
Number.isNaN(undefined); //false
Number.isNaN({}); //false
Number.isNaN("blabla"); //false
//下面都返回false
Number.isNaN(true);
Number.isNaN(null);
Number.isNaN(37);
Number.isNaN("37");
Number.isNaN("37.37");
Number.isNaN("");
Number.isNaN(" ");
parseInt()、parseFloat()
//ES5的写法
parseInt("12.34") //12
parseInt("123.45#") //123.45
//ES6的写法
Number.parseInt("12.34") //12
Number.parseFloat("123.45#") //123.45
三、Math的扩展
Math.trunc方法用于去除一个数的小数部分,返回整数部分
console.log(Math.trunc(4.1))
console.log(Math.trunc(4.9))
console.log(Math.trunc(-4.1))
console.log(Math.trunc(-4.9))
console.log(Math.trunc(-0.1234))
Math.sign方法用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值
Math.sign(-5) //-1
Math.sign(5) //+1
Math.sign(0) //+0
Math.sign(-0) //-0
Math.sign(NaN) //NaN
Math.sign('') //0
Math.sign(true) //+1
Math.sign(false) //0
Math.sign(null) //0
Math.sign('9') //+1
Math.sign('foo') //NaN
Math.sign() //NaN
Math.sign(undefined) //NaN
Math.cbrt方法用于计算一个数的立方根
console.log(Math.cbrt(-1)) //-1
console.log(Math.cbrt(0)) //0
console.log(Math.cbrt(1)) //1
console.log(Math.cbrt(8)) //2
Math.hypot方法返回所有参数的平方和的平方根
Math.hypot(3, 4); //5
Math.hypot(3, 4, 5); //7.0710678118654755
Math.hypot(); //0
Math.hypot(NaN); //NaN
Math.hypot(3, 4, "foo"); //NaN
Math.hypot(3, 4, "5"); //7.0710678118654755
Math.hypot(-3); //3
四、函数的扩展
function fn(a, b, c, d){
//argument.length打印的是实参个数
console.log(argument.length)
}
console.log(fn.length) //fn.length返回的是形参的个数
fn(1, 2, 3)
function fn(a, b=3, c, d=1){
//argument.length打印的是实参个数
console.log(arguments.length)
}
console.log(fn.length)
fn()
//fn.length会受到这个默认值的影响,遇到默认值的情况就停止下来
五、临时作用域
1.如果说到解析当中,形参当中如果有默认值,会形成一个临时作用域
2.如果在当前的作用域里面去找值,如果没有声明,则往父级去找
3.注意区分已经声明和没有声明的区别
var x = 1;
function fn(x, y=x){ //临时作用域let x; x = 5; y = x = 2;
console.log(y)
}
fn(5)
var x =1;
function fn(x, y=x){ //let x; x = undefined; y = x = undefined;
console.log(y)
}
fn()
var x = 1;
function fn(y=x){ //x =1; y = x = 1;
console.log(y)
}
fn()
var x = 1;
function fn(x=x){ //let x; x = x;
console.log(x)
}
fn()
let x = 1;
function fn(x, y=function(){x=2}){ //x=2;
console.log(x)
var x = 3;
console.log(y)
y();
console.log(x) //3
}
fn()
let x = 1;
function fn(x, y = function(){x=2}){ //let x = undefined; x=3; x=2
console.log(x)
x = 3;
console.log(y)
y(); //x=2
console.log(x)
}
fn()
六、箭头函数
var f = function(v){
return a;
}
var f = 定义变量
=>左边的值(v):形参
=>右边的值(a):return值
箭头函数本身不属于正规函数,是类似函数表达式
apply,bind,call都失效,因为他的作用域本身没有this指针,里面可以存在this指针,this指针指向父级
var f = v => a;
var f = function(a, b){
let num = a + b;
console.log(num);
}
f(1, 2)
var f = (a, b) => {
let num = a + b;
console.log(num)
return num;
}
console.log(f(1, 2));
var f = function(){
console.log(123)
}
var f = () =>{
console.log(123)
}
let obj = {
fn:function(){
console.log(this)
},
f:() => {
console.log(this)
}
}
obj.fn()
obj.f()