日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

js date转string_JS之你到底是什么类型?

發布時間:2024/9/18 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js date转string_JS之你到底是什么类型? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們都知道JS中包含兩種數據類型:基本數據類型和引用數據類型。

基本數據類型:String、Number、Boolean、Null、Undefined、Symbol(ES6新增,表示獨一無二的值)

引用數據類型:Object(包含Array、Function、Date、RegExp)

基本數據類型保存的值是直接存儲在棧(stack)內存中,而引用數據類型存儲在棧內存的是指向堆(heap)內存的引用(或者說指針,而真正的數據是保存在堆內存中的)

從一個變量向另一個變量復制基本數據類型時: 復制的是值本身

var number = 5; var number_copy = number; /*number和number_copy中的值是相互獨立的,兩個變量可以任意操作而不互相影響 */

從一個變量向另一個變量復制引用數據類型時:復制的是引用

var object = {name: 'ckn', age: 18}; var object_copy = object; object_copy.name = 'lxh'; /*復制的是引用,復制結束后,兩個變量實際上引用的還是同一個對象修改其中任何一個變量,都會影響另外一個變量 */

我們在日常開發中會經常判斷一個數據的類型,是數組類型還是對象類型還是undefined或者null這種特殊的類型

判斷基本數據類型,我們可以使用 typeof 很容易得到基本數據類型是什么數據類型,null除外,因為一些js歷史遺留問題,null被視為object

function log(target){return console.log(target); } log(typeof 110); // number log(typeof 'hello world'); // string log(typeof true); // boolean log(typeof undefined); // undefined log(typeof null); // object log(typeof {name: 'ckn', age: 18}); // object log(typeof [1,2,3,4]); // object 我們其實期望得到的是array log(typeof function() {log(1)}) // function // 我們可以通過 Array.isArray()來判斷其是否是數組 // 或者我們也可以 instanceof 來判斷屬于哪一類對象 log([1,2,3,4] instanceof Array); // true

其實無論用typeof 還是 instanceof 或者是 Array.isArray判斷數據的具體類型,都有一定的局限性,很繁瑣。讓人不禁想問就沒有更通用的方法來一次就判斷出該數據到底屬于什么類型嗎?

當然是有這樣的方法了,請看下面的代碼:

function log(target){return console.log(target); } function whatType(target){return Object.prototype.toString.call(target).slice(8, -1); } log(whatType(110)); // Number log(whatType('hello world')); // String log(whatType(true)); // Boolean log(whatType({name: 'ckn',age: 18})); // Object log(whatType([1,2,3,4])); // Array log(whatType(function(){log(1)})); // Function log(whatType(undefined)); // Undefined log(whatType(null)); // Null log(whatType(/z-Z/)); RegExp log(whatType(new Date())); // Date

我一開始很不理解為什么調用Object.prototype.toString方法就可以得到某個數據的具體類型,我們來先看下Object.prototype.toString方法 :

MDN :每個對象都有一個toString()方法,當該對象被表示為一個文本值時,或者一個對象以預期的字符串方式引用時自動調用。默認情況下,toString()方法被每個Object對象繼承。如果此方法在自定義對象中未被覆蓋,toString() 返回 "[object type]",其中type是對象的類型。let obj = {name: 'ckn', age: 18} /*obj是Object構造函數的實例對象 obj.toString方法是繼承自Objectconsole.log(obj.toString === Object.prototype.toString); true */ console.log(obj.toString()); // 這個很重要 它打印出的是[object Object] /*arr是Array構造函數的實例對象 arr.toString方法是繼承自Arrayconsole.log(arr.toString === Array.prototype.toString); true */ let arr = [1,2,3]; console.log(array.toString()); // "1,2,3,4" 字符串形式 /*bar是Function構造函數的實例對象 bar.toString方法是繼承自Functionconsole.log(bar.toString === Function.prototype.toString); true */ let bar = function() { console.log('hello world') } console.log(bar.toString()); // "function() { console.log('hello world') }"// 其實根據MDN的解釋,我們還可以自定義obj的toString方法 這樣就不會繼承來自Object的toString方法了 obj.prototype.toString = function toStringSelf() {return `your name is ${this.name}, your age is ${this.age}` } obj.toString(); // your name is ckn, your age is 18/* console.log(bar.toString); ? (){return"function"==typeof this&&this.__raven__?t._originalFunctionToString.apply(this.__orig__,arguments):t._originalFunctionToString.apply(this,arguments)} */

我們知道了Object對象的toString方法調用后可以打印出 "[object Object]" 這個奇怪的東西,Array對象的toString方法調用后是得到字符串形式的每項的值,Function對象的toString方法調用后得到的是該函數對象的整體語句內容和結構

接下來我們分析:

Object.prototype.toString.call(target)

我們知道call方法可以修改函數執行時的上下文對象this指向,此時Object.prototype.toString方法內部的this指的就是傳進來的target對象

通過上面的分析,我們發現toString方法除了Object內部實現了,Array、Function、String、Number、Boolean、RegExp、Symbol等構造函數都對其進行了實現 (在各自原型上都有toString方法的實現)

其中有區別的是: Function、Number、String、Date的toString方法規定了函數內部的this指向必須分別是function、number、string、date類型,否則將會報錯,例如:

Function.prototype.toString.call({name:'ckn', age:18}); // Uncaught TypeError:Function.prototype.toString requires that 'this' be a FunctionFunction.prototype.toString.call(function() {}); // "function() {}"Number.prototype.toString.call({name:'ckn', age:18}); // Uncaught TypeError:Number.prototype.toString requires that 'this' be a Number Number.prototype.toString.call(101); // "101"

而Array的toString方法內部并沒有明確規定函數內部this指向必須是數組類型,可以是任意類型,是數組類型的時候返回的是遍歷數組的每一項然后調用toString方法的返回值,但當是null和undefined的時候則會報錯

Array.prototype.toString.call(function(){}); // "[object Function]" Array.prototype.toString.call({name: 'ckn',age: 18}); // "[object Object]" Array.prototype.toString.call(new Date); // "[object Date]" Array.prototype.toString.call([1,function(){},{}]); // "1,function(){},[object Object]"Array.prototype.toString.call(undefiend); // Uncaught TypeError: Cannot convert undefined or null to objectArray.prototype.toString.call(null); // Uncaught TypeError: Cannot convert undefined or null to object

同樣Obiect的toString方法內部也沒有明確規定函數內部this指向必須是對象類型,可以是任意數據類型,而且當是null和undefined時也不會報錯

Object.prototype.toString.call(undefined); // "[object Undefined]" Object.prototype.toString.call(null); // "[object Null]"Object.prototype.toString.call(function(){}); // "[object Function]" Object.prototype.toString.call({name: 'ckn',age: 18}); // "[object Object]" Object.prototype.toString.call(new Date); // "[object Date]" Object.prototype.toString.call([1,function(){},{}]); // "[object Array]" Object.prototype.toString.call(/z-Z/); // "[object RegExp]"

ok,到此我們發現了Object的toString方法最牛掰,可以分辨出任何數據類型

function whatType(target) {reutnr Object.prototype.toString.call(target).slice(8, -1); }

總結

以上是生活随笔為你收集整理的js date转string_JS之你到底是什么类型?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。