溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JavaScript中常用的簡潔高級技巧有哪些

發(fā)布時間:2021-06-30 11:23:15 來源:億速云 閱讀:126 作者:小新 欄目:web開發(fā)

這篇文章主要為大家展示了“JavaScript中常用的簡潔高級技巧有哪些”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“JavaScript中常用的簡潔高級技巧有哪些”這篇文章吧。

一、數(shù)據(jù)類型檢測

1.1 typeof

typeof操作符返回一個字符串,表示未經(jīng)計算的操作數(shù)的類型;該運算符數(shù)據(jù)類型(返回字符串,對應(yīng)列表如圖)

JavaScript中常用的簡潔高級技巧有哪些

1.2 instanceof

var str = "This is a simple string"; 
var num = 1111;
var boolean = true;
var und = undefined;
var nl = null;
var sb = Symbol('1111');
var obj = {}; // 非原始類型數(shù)據(jù)字面量定義

console.log(str instanceof String);  // false
console.log(num instanceof Number);  // false
console.log(boolean instanceof Boolean); // false
console.log(nl instanceof Object);  // false
console.log(sb instanceof Symbol);  // false
console.log(obj instanceof Object);  // true

var strN = new String("This is a simple string");
var numN = new Number(1111);
var booleanN = new Boolean(true);
var objN = new Object();

console.log(strN instanceof String);  // true
console.log(numN instanceof Number);  // true
console.log(booleanN instanceof Boolean); // true
console.log(objN instanceof Object);  // true

instanceof運算符用于測試構(gòu)造函數(shù)的prototype屬性是否出現(xiàn)在對象的原型鏈中的任何位置;

由上結(jié)果,字面量產(chǎn)出的原始數(shù)據(jù)類型無法使用instanceof判斷。

1.3 Object.propotype.toString

Object.prototype.toString.call('string'); //"[object String]"
Object.prototype.toString.call(1111);  //"[object Number]"
Object.prototype.toString.call(true);  //"[object Boolean]"
Object.prototype.toString.call(null);  //"[object Null]"
Object.prototype.toString.call(undefined); //"[object Undefined]"
Object.prototype.toString.call(Symbol('111')); //"[object Symbol]"
Object.prototype.toString.call({});  //"[object Object]"

上述方法最為便捷有效

1.4 constructor

比較對象的構(gòu)造函數(shù)與類的構(gòu)造函數(shù)是否相等

var a = {}
a.constructor === Object // true

var b = '111';
b.constructor === String // true

var strN = new String('11111');
strN.constructor === String // true

var c = true;
c.constructor === Boolean // true

var d = Symbol('symbol')
d.constructor === Symbol // true

1.5 propotype

比較對象的原型與構(gòu)造函數(shù)的原型是否相等

var a = {}
a.__proto__ === Object.prototype // true

var t = new Date();
t.__proto__ === Date.prototype // true


var str = 'sting';
str.__proto__ === String.prototype // true

var strN = new String('11111');
strN.__proto__ === String.prototype // true

二、數(shù)據(jù)特殊操作

2.1 交換兩個值

2.1.1 利用一個數(shù)異或本身等于0和異或運算符合交換率

var a = 3;
var b = 4
a ^= b; // a = a ^ b
b ^= a;
a ^= b;

console.log(a, b);

2.1.2 使用ES6解構(gòu)賦值

let a = 1;
let b = 2;

[b, a] = [a, b];

console.log(a, b);

2.2 小數(shù)取整

var num = 123.123

// 常用方法
console.log(parseInt(num)); // 123
// “雙按位非”操作符
console.log(~~ num); // 123
// 按位或
console.log(num | 0); // 123
// 按位異或
console.log(num ^ 0); // 123
// 左移操作符
console.log(num << 0); // 123

2.3 數(shù)字金額千分位格式化

2.3.1 使用Number.prototype.toLocaleString()

var num = 123455678;
var num1 = 123455678.12345;

var formatNum = num.toLocaleString('en-US');
var formatNum1 = num1.toLocaleString('en-US');

console.log(formatNum); // 123,455,678
console.log(formatNum1); // 123,455,678.123

2.3.2 使用正則表達(dá)式

var num = 123455678;
var num1 = 123455678.12345;

var formatNum = String(num).replace(/\B(?=(\d{3})+(?!\d))/g, ',');
var formatNum1 = String(num1).replace(/\B(?=(\d{3})+(?!\d))/g, ',');

console.log(formatNum); // 123,455,678
console.log(formatNum1); // 123,455,678.12,345

三、對象數(shù)據(jù)常用操作

3.1 深度克隆技巧

3.1.1 JSON.stringify 轉(zhuǎn)換成字符, JSON.parse重新生成JSON數(shù)據(jù)類型

function deepClone(obj) {
 return JSON.parse(JSON.stringify(obj));
}
var obj = {
 number: 1,
 string: 'abc',
 bool: true,
 undefined: undefined,
 null: null,
 symbol: Symbol('s'),
 arr: [1, 2, 3],
 date: new Date(),
 userInfo: {
  name: 'Better',
  position: 'front-end engineer',
  skill: ['React', 'Vue', 'Angular', 'Nodejs', 'mini programs']
 },
 func: function () {
  console.log('hello better');
 }
}

console.log(deepClone(obj))

從打印結(jié)果可以得出以下結(jié)論:

  • undefined、symbol、function 類型直接被過濾掉了

  • date 類型被自動轉(zhuǎn)成了字符串類型

3.1.2 常用方式 簡單遞歸

function deepClone(obj) {
 var newObj = obj instanceof Array ? [] : {};
 for (let i in obj) {
  newObj[i] = typeof obj[i] === 'object' ? deepClone(obj[i]) : obj[i]
 }
 return newObj;
}

var obj = {
 number: 1,
 string: 'abc',
 bool: true,
 undefined: undefined,
 null: null,
 symbol: Symbol('s'),
 arr: [1, 2, 3],
 date: new Date(),
 userInfo: {
  name: 'Better',
  position: 'front-end engineer',
  skill: ['React', 'Vue', 'Angular', 'Nodejs', 'mini programs']
 },
 func: function () {
  console.log('hello better');
 }
}

console.log(deepClone(obj))

從打印的結(jié)果來看,這種實現(xiàn)方式還存在很多問題:這種方式只能實現(xiàn)特定的object的深度復(fù)制(比如對象、數(shù)組和函數(shù)),不能實現(xiàn)null以及包裝對象Number,String ,Boolean,以及Date對象,RegExp對象的復(fù)制。

3.2 對象遍歷方式

3.2.1 for-in

function A() {
	this.a = 1
	this.b = 1
}

A.prototype = {
	c: 1,
	d: 2
}

var a = new A()

for(var i in a) {
 console.log(i)
}

由上打印結(jié)果可知,for-in 會遍歷對象屬性,包括原型鏈中的屬性

3.2.2 Object.entries()

function A() {
	this.a = 1
	this.b = 1
}

A.prototype = {
	c: 1,
	d: 2
}

var a = new A()
var et = Object.entries(a)
console.log(et)

由上結(jié)果可知,entries 返回一個給定對象自身可枚舉屬性的鍵值對數(shù)組

3.2.3 Object.keys()、 Object.values()

function A() {
	this.a = 1
	this.b = 1
}

A.prototype = {
	c: 1,
	d: 2
}

var a = new A()
var keys = Object.keys(a)
var values = Object.values(a)
console.log(keys, values)

由上結(jié)果可知,keys, values 返回一個給定對象自身可枚舉屬性數(shù)組,自身可枚舉屬性值的數(shù)組

四、數(shù)組常用操作

4.1 數(shù)組去重

4.1.1 Set 去重

var arr = [1,2,1,1,22,4,5,6];
arr1 = [...new Set(arr)];

4.1.2 結(jié)合使用數(shù)組filter方法和indexOf()方法

var arr = [1, 2, 3, 2, 6, '2', 3, 1];
function uniqueArr (arr) {
 return arr.filter(function (ele, index, array) {
  // 利用數(shù)組indexOf()方法,返回找到的第一個值的索引
  // 如果數(shù)組元素的索引值與indexOf方法查找返回的值不相等,則說明該值重復(fù)了,直接過濾掉
  return array.indexOf(ele) === index;
 })
}

4.2 多維數(shù)組一行代碼實現(xiàn)一維轉(zhuǎn)換

var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];

var resultArr = arr.toString().split(',').map(Number);

console.log(resultArr); // [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]

4.3 一行代碼實現(xiàn)獲取一個網(wǎng)頁使用了多少種標(biāo)簽

[...new Set([...document.querySelectorAll('*')].map(node => node.tagName))].length;

4.4 如何實現(xiàn)a == 1 && a == 2 && a == 3

4.4.1  改寫數(shù)組的toString方法

var a = [1, 2, 3];
// a.join = a.shift;
// a.valueOf = a.shift;
a.toString = a.shift;

console.log(a == 1 && a == 2 && a == 3); // true

原理:當(dāng)復(fù)雜類型數(shù)據(jù)與基本類型數(shù)據(jù)作比較時會發(fā)生隱性轉(zhuǎn)換,會調(diào)用toString()或者valueOf()方法

4.4.2  改寫對象的toString方法

var a = {
 value: 1,
 toString: function () {
  return a.value++;
 }
}
console.log(a == 1 && a == 2 && a == 3); // true

4.5 統(tǒng)計字符串中相同字符出現(xiàn)的次數(shù)

var str = 'aaabbbccc66aabbc6';

var strInfo = str.split('').reduce((p, c) => (p[c]++ || (p[c] = 1), p), {});

console.log(strInfo); // {6: 3, a: 5, b: 5, c: 4}

4.6 將類數(shù)組對象轉(zhuǎn)成數(shù)組

4.6.1 使用Array.prototype.slice

var likeArrObj = {
 0: 1,
 1: 2,
 2: 3,
 length: 3
}

var arr1 = Array.prototype.slice.call(likeArrObj); // 或者使用[].slice.call(likeArrObj);
console.log(arr1); // [1, 2, 3]

4.6.2 使用Array.from

var likeArrObj = {
 0: 1,
 1: 2,
 2: 3,
 length: 3
}

var arr = Array.from(likeArrObj);
console.log(arr); // [1, 2, 3]

4.6.3 使用Object.values (此處省略)

以上是“JavaScript中常用的簡潔高級技巧有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI