什麼才是正確的javascript數組檢測方式

来源:http://www.cnblogs.com/xiaohuochai/archive/2016/07/18/5680833.html
-Advertisement-
Play Games

[1]typeof [2]instanceof [3]toString [4]isArray ...


前面的話

  對於確定某個對象是不是數組,一直是數組的一個經典問題。本文專門將該問題擇出來,介紹什麼才是正確的javascript數組檢測方式 

 

typeof

  首先,使用最常用的類型檢測工具——typeof運算符

var arr = [1,2,3];
console.log(typeof arr);//'object'

  前面已經介紹過,數組的本質是一種特殊的對象,所以返回'object'。typeof運算符只能用來區分原始類型和對象類型,對於更具體的對象類型是無法鑒別出來的

 

instanceof

  這時,該instanceof運算符出場了,instanceof運算符用來判斷一個對象是否是特定構造函數的實例

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

var str = '123';
console.log(str instanceof Array);//false

  看上去很實用。但,這時就引出了數組檢測的經典場景——網頁中包含多個框架

  【1】先創建一個父網頁box.html和子網頁in.html,其中父網頁通過iframe包含子網頁

//子網頁為空
//父網頁
<iframe name="child" src="in.html"></iframe>

  【2】測試父網頁和子網頁的通信,註意一定要在伺服器環境下測試

//子網頁
var arr = [1,2,3];

//父網頁
window.onload = function(){
    console.log(child.window.arr);// [1,2,3]
}

  【3】測試成功,這時進行數組檢測

//子網頁
var arr = [1,2,3];

//父網頁
function test(arr){
    return arr instanceof Array;
}
window.onload = function(){
    console.log(child.window.arr);// [1,2,3]
    console.log(test(child.window.arr));//false
}

  測試後發現,數組檢測的結果是false。這是因為網頁中包含多個框架,那實際上就存在多個不同的全局環境,從而存在不同版本的Array構造函數。如果從一個框架向另一個框架傳入一個數組,那麼傳入的數組與在第二個框架中原生創建的數組分別具有各自不同的構造函數

 

toString

  typeof操作符在這裡幫不上忙,而instanceof操作符只能用於簡單的情形,這時就需要祭出大殺器——toString(),通過引用Object的toString()方法來檢查對象的類屬性,對數組而言該屬性的值總是"Array"

var arr = [1,2,3];
console.log(Object.prototype.toString.call(arr) === '[object Array]');//true

  或者,可以自定義類型識別函數

function type(obj){
    return Object.prototype.toString.call(obj).slice(8,-1).toLowerCase();
}
var arr = [1,2,3];
console.log(type(arr));//'array'

  在多框架環境中測試,同樣返回'array'

//子網頁
var arr = [1,2,3];

//父網頁
function test(arr){
    return arr instanceof Array;
}
function type(obj){
    return Object.prototype.toString.call(obj).slice(8,-1).toLowerCase();
}
window.onload = function(){
    console.log(child.window.arr);// [1,2,3]
    console.log(test(child.window.arr));//false
    console.log(type(child.window.arr));//'array'
}

 

isArray

  為了讓數組檢測更方便,ECMAScript5新增了Array.isArray()方法。該方法的目的是最終確定某個值到底是不是數組,而不管它在哪個全局環境中創建的 

var arr = [1,2,3];
console.log(Array.isArray([]));//true
console.log(Array.isArray({}));//false
console.log(Array.isArray(arr));//true

  在多框架環境中測試,同樣返回true

//子網頁
var arr = [1,2,3];

//父網頁
console.log(Array.isArray(child.window.arr));//true

 

完整測試代碼

【子網頁(in.html)】

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<script>
var arr = [1,2,3];
</script>    
</body>
</html>

【父網頁(box.html)】

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<iframe name="child" src="in.html"></iframe>
<script>
function test(arr){
    return arr instanceof Array;
}
function type(obj){
    return Object.prototype.toString.call(obj).slice(8,-1).toLowerCase();
}
window.onload = function(){
    console.log(child.window.arr);// [1,2,3]
    console.log(test(child.window.arr));//false
    console.log(type(child.window.arr));//'array'
    console.log(Array.isArray(child.window.arr));//true
}
</script>    
</body>
</html>

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上周看到大家在JS群討論如何把一句英文句子單詞收割字母大寫,大家都說用正則簡單,對於正則還是有點模糊,於是乎自己敲了下 結果是出來了,總感覺不是很好、、、 ...
  • 使用方法:在JS包的說明裡;直接使用例子也是可以的 起因:一直以來,移動端選擇器都是自己在網上滿世界的找插件 缺點: 1.前期需要自己找非常多的插件,進行篩選;浪費了自己大量的時間 2.符合要求的少之又少,能最後用上的就更少了; 3.項目有特殊要求,又要符合設計稿,難上加難; 所以,這次自己寫了一個 ...
  • 通過packet capture對舊版的第三方app進行抓包分析以後,能夠獲取cnblogs對app開放的一些api。 簡要介紹直接和網站文章內容相關的api。 希望更多精美的第三方app能夠出現 :) host:http://www.cnblogs.com endpoint:/mvc/aggsit ...
  • 使用JavaScript讀二進位文件並用ajax傳輸二進位流,目前能夠相容谷歌、IE11、IE10。 ...
  • 對於JavaScript的定時器來說沒有嚴格意義上的暫停和重啟,只有清除停止,但是可以通過一些‘障眼法’實現 allChild[index].onclick = function(){//當點擊目標且滿足下麵的條件時 讓計時器時間暫停 if(gamInt == true){ $("#tu").css ...
  • Ctrl+Shift+P:打開命令面板Ctrl+P:搜索項目中的文件Ctrl+G:跳轉到第幾行Ctrl+W:關閉當前打開文件Ctrl+Shift+W:關閉所有打開文件Ctrl+Shift+V:粘貼並格式化Ctrl+D:選擇單詞,重覆可增加選擇下一個相同的單詞Ctrl+L:選擇行,重覆可依次增加選擇下 ...
  • 頂求網首頁是一個web2.0博客類的網站首頁,在該網站中用戶可以發表博客,也可以推薦圖書給其他用戶。所以,在首頁中主要分三個板塊——文章、圖書、用戶。另外,網站的頭部和尾部還要有導航(navigator,固定在頭部)和腳註(footer),而這些元素也是整個網站都要用到的,具體實現時可以把它們放在網... ...
  • /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.length; for(var i=0;i<len;i++){ for(var j=i+1;j<len;j++) { if(arr[i]==a ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...