JS(三) | 青训营

51 阅读3分钟

运算符

  1. 算术,赋值等运算符
  • ”=“ 赋值

  • ”===“ 严格全等,==只有值等

  • ”!==“ 不相等

  • ** 幂,如3** 2,3的2次方

  • +=类相同

  • =

  • 三元运算符


condition ? 运行这段代码 : 否则,运行这段代码

  • x>>>y,无符号右移

  • ~ 按位非,反转被操作的位,001反转后110

  1. 解构

var foo = ["one", "two", "three"];

  


// 不使用解构

var one = foo[0];

var two = foo[1];

var three = foo[2];

  


// 使用解构

var [one, two, three] = foo;

  1. 其他.
  • delete操作符删除一个对象的属性或者一个数组中某一个键值,操作成功,仍旧存在但值变为undefined

  • void 运算符:表示运算没有返回值

  • in操作符:

指定的属性确实存在于所指定的对象中,返回true。如果是数组,则不能用值来判断是否in


var trees = new Array("redwood", "bay", "cedar", "oak", "maple");

0 in trees; // returns true

"bay" in trees; // returns false

"length" in trees; //returns true

也就是说,只能用属性而不能用值in

  • instance of:

确认一个对象在运行时的类型


var theDay = new Date(1995, 12, 17);

if (theDay instanceof Date) {

// statements to execute

}

  • typeof X ,return X的类型

typeof true; // returns "boolean"

函数与表达式

  1. 函数本身就是对象。方法是,一个函数是一个对象的属性时。

函数括号:函数调用运算符,想直接调用函数的地方才这么写


function 名字(){}

  1. 内置浏览器函数:大多数并非js编写,并不是函数,是方法。

  2. 函数传参如果是对象,函数改变了这个对象的属性,这样的改变结果包括函数外部

  3. 匿名函数也称为函数表达式

匿名函数里的代码并不会直接运行,相当于调用函数时,函数不加括号

运行负载的代码以响应事件触发。函数表达式与函数声明有一些区别。函数声明会进行声明提升,而函数表达式不会。


myButton.onclick = function() {

alert('hello');

}

函数表达式也可以提供函数名,并且可以用于在函数内部代指其本身,或者在调试器堆栈跟踪中识别该函数


const factorial = function fac(n) {

return n<2 ? 1 : n*fac(n-1)};

  


console.log(factorial(3)); //6

  1. 函数作用域:scope

函数内定义的变量和其他东西都在它们自己的单独的范围内。所有函数的最外层被称为全局作用域

  1. 闭包

function outside(x) {

function inside(y) {

return x + y;

}

return inside;

}

fn_inside = outside(3);

result = fn_inside(5); // returns 8

  


result1 = outside(3)(5); // returns 8

一个闭包必须保存它可见作用域中所有参数和变量。因为每一次调用传入的参数都可能不同,每一次对外部函数的调用实际上重新创建了一遍这个闭包。只有当返回的 inside 没有再被引用时,内存才会被释放。

命名冲突

作用域链中的第一个元素就是最里面的作用域,最后一个元素便是最外层的作用域

最里面的作用域有更高的优先权

  1. arguments对象:

里面存储了传递过来的所有实参

在你事先不知道会需要将多少参数传递给函数时十分有用。

argument是类数组对象,并不是一个数组。称其为类数组对象是说它有一个索引编号和length属性,并不具有pop等函数


function myConcat(separator) {

var result = ' ';

for (var i = 1; i < arguments.length; i++)

{

result += arguments[i] + separator;

}

return result;

}

  


// returns red, orange, blue, myConcat(", " , "red", "orange", "blue");

  1. 参数:
  • 默认参数:在参数中直接设默认值

function multiply(a, b = 1) {

return a*b;

}

  


multiply(5); // 5

  • 剩余参数:允许将不确定数量的参数表示为数组

function multiply(multiplier, ...theArgs) {

return theArgs.map(x => multiplier * x);

}

  


var arr = multiply(2, 1, 2, 3);

console.log(arr); // [2, 4, 6]

  1. 特殊函数
  • 箭头函数

更简洁的表达方式,

() => x 比 () => { return x; } 更简洁一些,但后一种保留 return 的写法才支持使用多个语句


//无参

var fn1 = () => {} 

// 单个参数

var fn2 = a => {}

// 多个参数

var fn3 = (a, b) => {}

// 可变参数

var fn4 = (a, b, ...args) => {} //箭头函数不能使用arguments

解决严格模式下的this


function Person(){

this.age = 0;

  


setInterval(() => {

this.age++; // 这里的`this`正确地指向 person 对象,如果采用普通函数,即闭包那么非严格模式下this将被定义为全局对象,无法起作用

}, 1000);}

  


var p = new Person();

//或者var selt=this,使得this.age变为self.age

  • 预定义函数:

eval() 方法会对一串字符串形式的 JavaScript 代码字符求值

  


isFinite() 函数判断传入的值是否是有限的数值

  


isNaN() 函数判断一个值是否是 NaN

  1. 表达式:
  • this:正在调用的对象;也可以指代当前的表单元素

<input type="text" name="age" size=3 onChange="validate(this, 18, 99);">

  


onchange事件处理中调用validat函数,用this来指代当前的表单元素

  • new:

创建一个自定义类型或者是预置类型的对象实例

  • super:

来调用一个对象父类的函数(尤其是构造函数)


super([arguments]); // calls the parent constructor. super.functionOnParent([arguments]);