JavaScript

?? 坑

要注意运算符 ?? 的优先级

1
2
3
4
5
6
let a = 2, b = 3;
a-b; // -1
a??0; // 2
b??0; // 3
a??0-b??0 // 竟然为 2
(a??0)-(b??0) // -1

== 和 === 区别

=== 严格相等,会比较两个值的类型和值

== 抽象相等,比较时,会先进行类型转换,然后再比较值

建议用 ===

具体可见

Js 中如何正确创建一个类

1
2
3
4
5
6
7
function Cat(name,color){
  this.name = name;
  this.color = color;
}

Cat.prototype.type = "猫科动物";
Cat.prototype.eat = function(){alert("吃老鼠")};
  1. 使用构造函数,成员变量使用 this 在构造函数中初始化;

    所谓”构造函数”,其实就是一个普通函数,但是内部使用了this变量。对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上。

    1
    2
    3
    4
    var cat1 = new Cat("大毛","黄色");
    var cat2 = new Cat("二毛","黑色");
    alert(cat1.name); // 大毛
    alert(cat1.color); // 黄色
  1. 类变量和方法定义在 prototype 上

    构造函数有一个 prototype 对象,该对象的所有属性和方法,都会被构造函数的实例继承。因此在这里定义类变量和方法可以实现不同对象之间的数据共享

JS 数组深拷贝

1
const newArray = JSON.parse(JSON.stringify(array));

JS Fetch 请求使用 application/x-www-form-urlencoded 的坑

body 参数必须自己手动编码,否则会出错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var details = {
'userName': 'test@gmail.com',
'password': 'Password!',
'grant_type': 'password'
};

var formBody = [];
for (var property in details) {
var encodedKey = encodeURIComponent(property);
var encodedValue = encodeURIComponent(details[property]);
formBody.push(encodedKey + "=" + encodedValue);
}
formBody = formBody.join("&");

fetch('https://example.com/login', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
},
body: formBody
})

数组中如果含有 undefined,不会参加 sort 函数的排序,会默认被排到最后

1
2
3
4
5
6
let years = [2011, undefined, 2012]
years.sort((a, b) => {
// undefined 元素不会参与排序
return b-a; // 输出 [2012, 2011, undefined]
// return a-b; // 输出 [2011, 2012, undefined]
});
  1. ?? 坑
  2. == 和 === 区别
  3. Js 中如何正确创建一个类
  4. JS 数组深拷贝
  5. JS Fetch 请求使用 application/x-www-form-urlencoded 的坑
  6. 数组中如果含有 undefined,不会参加 sort 函数的排序,会默认被排到最后