VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 网站开发 > JavaScript教程 >
  • 知识杂点小记(一)

1. delete操作符返回一个布尔值: true指删除成功,否则返回false. 但是通过 var, const 或 let 关键字声明的变量无法用 delete 操作符来删除。

const name = "Lydia";
age = 21;

console.log(delete name); //false
console.log(delete age); //true

用delete关键字删除对象的属性,对原型也是适用的。删除了原型的属性后,该属性在原型链上就不可用了。

class Dog {
    constructor(name) {
        this.name = name;
    }
}

Dog.prototype.bark = function() {
    console.log('Woof I am ${this.name}');
};

const pet = new Dog("Mara");

pet.bark(); //"Woof I am Mara"

delete Dog.prototype.bark;

pet.bark(); //TypeError

2. 通过 let 和 const 关键字声明的变量也会提升,但是和 var 不同,它们不会被初始化。在我们声明(初始化)之前是不能访问它们的。这个行为被称之为暂时性死区。

function sayHi() {
    console.log(name); //undefined 
    console.log(age); //ReferenceError
    var name = 'Lydia';
    let age = 21;
}

sayHi();

通过 var 关键字声明的,值是全局作用域下的,通过 let 和 const 关键字声明的变量是拥有块级作用域。

for (var i = 0; i < 3; i++) {
    setTimeout(() => console.log(i), 1) //3 3 3
}

for (let i = 0; i < 3; i++) {
    setTimeout(() => console.log(i), 1) //0 1 2
}
function checkAge(age) {
    if (age < 18) {
        const message = "Sorry, you're too young."
    } else {
        const message = "Yay! You're old enough!"
    }
    
    return message
}

console.log(checkAge(21)) // ReferenceError
function checkAge(age) {
    if (age < 18) {
        var message = "Sorry, you're too young."
    } else {
        var message = "Yay! You're old enough!"
    }
    
    return message
}

console.log(checkAge(21)) // "Yay! You're old enough!"

3. 对于箭头函数,this 关键字指向的是它当前周围作用域(简单来说是包含箭头函数的常规函数,如果没有常规函数的话就是全局对象),这个行为和常规函数不同。

const shape = {
    radius: 10,
    diameter() {
        return this.radius * 2
    },
    perimeter: () => 2 * Math.PI * this.radius
}

shape.diameter(); // 20
shape.perimeter(); // NaN

这意味着当我们调用 perimeter 时,this 不是指向 shape 对象,而是它的周围作用域(在例子中是 window)。在 window 中没有 radius 这个属性,因此返回 undefined。

4. 六种 falsy 值(虚值)

  • undefined
  • null
  • NaN
  • 0
  • '' (empty string)
  • false

5. JavaScript 只有基本类型和对象。

基本类型包括 boolean, null, undefined, bigint, number, string, symbol。

6. 用defineProperty方法添加的属性默认不可变。可以通过writable, configurable 和 enumerable属性来改变这一行为

const person = { name: "Lydia" };

Object.defineProperty(person, "age", { value: 21 });

console.log(person); //{ name: "Lydia", age: 21 }
console.log(Object.keys(person)); //["name"]

通过defineProperty方法,我们可以给对象添加一个新属性,或者修改已经存在的属性。而我们使用defineProperty方法给对象添加了一个属性之后,属性默认为 不可枚举(not enumerable). Object.keys方法仅返回对象中 可枚举(enumerable) 的属性,因此只剩下了"name".

7. JSON.stringify的第二个参数是 替代者(replacer). 替代者(replacer)可以是个函数或数组,用以控制哪些值如何被转换为字符串。

const settings = {
    username: "lydiahallie",
    level: 19,
    health: 90
};

const data = JSON.stringify(settings, ["level", "health"]);
console.log(data); //"{"level":19, "health":90}"

在本例中,只有名为"level" 和 "health" 的属性被包括进来, "username"则被排除在外。 data 就等于 "{"level":19, "health":90}".

8. 一元操作符 i++ 先返回 操作值, 再累加操作值。++i 先累加再返回值

let num = 10;
const increaseNumber = () => num++;
const increasePassedNumber  = () => ++num;
const num1 = increaseNumber();
const num2 = increasePassedNumber(num1);

console.log(num1); //10
console.log(num2); //12

9. 每个Symbol都是完全唯一的。传递给Symbol的参数只是给Symbol的一个描述。 Symbol的值不依赖于传递的参数。 当我们测试相等时,我们创建了两个全新的符号

console.log(Number(2) === Number(2)) /true
console.log(Boolean(false) === Boolean(false)) //true
console.log(Symbol('foo') === Symbol('foo')) //false

10. ES2017 引入了字符串补全长度的功能。如果某个字符串不够指定长度,会在头部或尾部补全。padStart()用于头部补全,padEnd()用于尾部补全。

const name = "Lydia Hallie"
console.log(name.padStart(13)) // " Lydia Hallie"(前面插入一个空格)
console.log(name.padStart(2)) // "Lydia Hallie"

11. 通过for-in循环,我们可以遍历一个对象自有的、继承的、可枚举的、非Symbol的属性。 在数组中,可枚举属性是数组元素的“键”, 即它们的索引。

通过for-of循环,我们可以迭代可迭代对象(包括 Array,Map,Set,String,arguments等)。当我们迭代数组时,在每次迭代中,不同属性的值将被分配给变量item。

const myLifeSummedUp = ["☕", "
      



  

相关教程