4個(gè)值得收藏的Javascript技巧
前言
學(xué)習(xí)一門語言的一種非常有效的方法就是閱讀該編程語言開發(fā)的優(yōu)秀開源項(xiàng)目的源代碼。 Vuejs
是最好的Javascript開源項(xiàng)目之一。
1.變量轉(zhuǎn)字符串
vue/src/shared/util.js
將值轉(zhuǎn)換為字符串是一個(gè)非常常見的需求,在Javascript中,有兩個(gè)函數(shù)將值轉(zhuǎn)換為字符串:
String()
JSON.stringify()
這兩個(gè)功能具有不同的機(jī)制,請看下面代碼:
console.log(String(null)); // null console.log(JSON.stringify(null)); // null console.log(String(undefined)); // undefined 這里是字符串 console.log(JSON.stringify(undefined)); // undefined 這里是變量 console.log(String("abc")); // abc console.log(JSON.stringify("abc")); // "abc" console.log(String({ key: "value" })); // [object Object] console.log(JSON.stringify({ key: "value" })); // {"key":"value"} console.log(String([1, 2, 3])); // 1,2,3 console.log(JSON.stringify([1, 2, 3])); // [1,2,3] const obj = { title: "devpoint", toString() { return "obj"; }, }; console.log(String(obj)); // obj console.log(JSON.stringify(obj)); // {"title":"devpoint"}
從上面輸出結(jié)果來看,兩個(gè)方法將對象轉(zhuǎn)為字符串機(jī)制存在差異,如何選擇呢?
- 實(shí)際開發(fā)中我們需要將
null
和undefined
轉(zhuǎn)換為字符串時(shí),經(jīng)常是希望它返回一個(gè)空字符串。 - 當(dāng)需要將一個(gè)數(shù)組和一個(gè)普通對象轉(zhuǎn)換為字符串時(shí),經(jīng)常使用
JSON.stringify
。 - 如果需要對象的
toString
方法被重寫,則需要使用String()。 - 在其他情況下,使用
String()
將變量轉(zhuǎn)換為字符串。
為了滿足以上條件,Vue源碼的實(shí)現(xiàn)如下:
function isPlainObject(obj) { return Object.prototype.toString.call(obj) === "[object Object]"; } function toString(val) { if (val === null || val === undefined) return ""; if (Array.isArray(val)) return JSON.stringify(val); if (isPlainObject(val) && val.toString === Object.prototype.toString) return JSON.stringify(val); return String(val); } const obj = { title: "devpoint", toString() { return "obj"; }, }; console.log(toString(obj)); // obj console.log(toString([1, 2, 3])); // [1, 2, 3] console.log(toString(undefined)); // "" console.log(toString(null)); // ""
2.普通對象
vue/src/shared/util.js
Object.prototype.toString
允許將對象轉(zhuǎn)換為字符串。對于普通對象,當(dāng)調(diào)用此方法時(shí),總是返回[object object]
。
const runToString = (obj) => Object.prototype.toString.call(obj); console.log(runToString({})); // [object Object] console.log(runToString({ title: "devpoint" })); // [object Object] console.log(runToString({ title: "devpoint", author: { name: "devpoint" } })); // [object Object]
類似上面這種對象我們稱之為普通對象。
在Javascript中還有一些特殊的對象,如Array
、String
和RegExp
,它們在Javascript引擎中具有特殊的設(shè)計(jì)。當(dāng)它們調(diào)用Object.prototype.toString
方法時(shí),會(huì)返回不同的結(jié)果。
const runToString = (obj) => Object.prototype.toString.call(obj); console.log(runToString(["devpoint", 2021])); // [object Array] console.log(runToString(new String("devpoint"))); // [object String] console.log(runToString(/devpoint/)); // [object RegExp]
為了區(qū)分特殊設(shè)計(jì)對象和普通對象,可以用下面的函數(shù)來實(shí)現(xiàn)。
function isPlainObject(obj) { return Object.prototype.toString.call(obj) === "[object Object]"; }
很多時(shí)候,我們希望一個(gè)函數(shù)只執(zhí)行一次。如果多次調(diào)用該函數(shù),則只會(huì)執(zhí)行第一次。
3.once
vue/src/shared/util.js
很多時(shí)候,我們希望一個(gè)函數(shù)只執(zhí)行一次。如果多次調(diào)用該函數(shù),則只會(huì)執(zhí)行第一次。
function once(fn) { let called = false; return function () { if (!called) { called = true; fn.apply(this, arguments); } }; } function launchRocket() { console.log("我已經(jīng)執(zhí)行了"); } const launchRocketOnce = once(launchRocket); launchRocketOnce(); launchRocketOnce(); launchRocketOnce();
4.瀏覽器嗅探
vue/src/core/util/env.js
我們知道Javascript可以在瀏覽器、nodejs等環(huán)境中運(yùn)行,那么如何檢查當(dāng)前的Javascript代碼是否在瀏覽器環(huán)境中運(yùn)行?
如果Javascript在瀏覽器環(huán)境中運(yùn)行,則會(huì)有一個(gè)全局對象:window
。因此,可以通過以下方式判斷環(huán)境:
const inBrowser = typeof window !== "undefined";
在Chrome中執(zhí)行
在Node中執(zhí)行
如果腳本在瀏覽器環(huán)境中運(yùn)行,那么我們可以通過以下方式獲取瀏覽器的userAgent:
const UA = inBrowser && window.navigator.userAgent.toLowerCase();
在Chrome中執(zhí)行
不同的瀏覽器具有不同的userAgent
。在Internet Explorer的userAgent
中,始終包含單詞MSIE
和Triden
t。在Chrome瀏覽器的userAgent
中,始終包含Chrome一詞。
同樣,在Android操作系統(tǒng)瀏覽器中,userAgent
始終包含單詞Android。在iOS中,總是有iPhone、iPad、iPod、iOS一詞。
因此,可以通過檢查userAgent
來確定當(dāng)前的瀏覽器供應(yīng)商和操作系統(tǒng)。
export const UA = inBrowser && window.navigator.userAgent.toLowerCase(); export const isIE = UA && /msie|trident/.test(UA); export const isIE9 = UA && UA.indexOf("msie 9.0") > 0; export const isEdge = UA && UA.indexOf("edge/") > 0; export const isAndroid = (UA && UA.indexOf("android") > 0) || weexPlatform === "android"; export const isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || weexPlatform === "ios"; export const isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge; export const isPhantomJS = UA && /phantomjs/.test(UA); export const isFF = UA && UA.match(/firefox\/(\d+)/);
附帶說明一下,Edge和Chrome均基于Chromium,因此兩種瀏覽器的userAgent
都包含Chrome一詞。也就是說,當(dāng)瀏覽器的userAgent
中包含Chrome一詞時(shí),該瀏覽器不一定是Chrome。const isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge
到此這篇關(guān)于4個(gè)值得收藏的Javascript技巧的文章就介紹到這了,更多相關(guān)Javascript技巧內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用原生JS實(shí)現(xiàn)滾輪翻頁效果的示例代碼
這篇文章主要介紹了使用原生JS實(shí)現(xiàn)滾輪翻頁效果的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05JavaScript實(shí)現(xiàn)簡單打地鼠游戲
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡單打地鼠游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10TypeScript函數(shù)和類型斷言實(shí)例詳解
在某些情況下,我們會(huì)比TS更清楚一個(gè)數(shù)據(jù)的類型,這種時(shí)候我們就可以使用斷言來告訴TS相信我,我知道自己在干什么,下面這篇文章主要給大家介紹了關(guān)于TypeScript函數(shù)和類型斷言的相關(guān)資料,需要的朋友可以參考下2022-06-06jQuery $.data()方法使用注意細(xì)節(jié)
前段時(shí)間同事在群里對jQuery里的.data()方法大發(fā)牢騷,接下來介紹jQuery $.data()方法使用注意細(xì)節(jié),需要了解的朋友可以參考下2012-12-12JavaScript.The.Good.Parts閱讀筆記(一)假值與===運(yùn)算符
JavaScript 假值與===運(yùn)算符,學(xué)習(xí)js的朋友可以看下。2010-11-11Textarea輸入字?jǐn)?shù)限制實(shí)例(兼容iOS&安卓)
下面小編就為大家?guī)硪黄猅extarea輸入字?jǐn)?shù)限制實(shí)例(兼容iOS&安卓)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07D3.js實(shí)現(xiàn)簡潔實(shí)用的動(dòng)態(tài)儀表盤的示例
本篇文章主要介紹了D3.js實(shí)現(xiàn)簡潔實(shí)用的動(dòng)態(tài)儀表盤的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04