由一次代碼優化想到的Js 數據類型

引子:

上周三進行了代碼優化,其中有一個很普遍的代碼,例如:

  if(test =="") {dothis();}else{dothat()} ----->可以簡化為 !test ? dothis():dothat();

  if(test =="") {dothis()}     ----->可以簡化為 !test&&dothis();

看這個問題簡化的根源,其實就是對test的值進行判斷,判斷是否為false或者是true,如果test==""就執行dothis()這個函數,這個其實就是類型的判斷問題,看來""就是一個false,于是我聯想,還是其他的嗎?

是有的,比如0,false,null,undefined,NaN,我寫了一個例子來測試下:

<!DOCTYPE HTML>
<html >
<head><meta charset="gbk"><title></title><script type="text/javascript">if(false || null || undefined || '' || 0 || NaN){alert(1);}else{alert(2);}</script>
</head>
<body>    
</body>
</html>

上述代碼我在各個瀏覽器下輸出為結果2,可見js中是將這6種類型的值當做false的,還有沒有其他的,目前我只想到這些,不過由這個的變體有很多,應用也很多,在函數中,對語句中等等的。。

Js 數據類型

 對于這個主題,首先來看幾個問題,如果你對這幾個問題很清楚的話,那就請直接跳過吧,不用接著往下看了,如果不清楚,建議你還是看看。

  1)如果判斷函數?function 和object的聯系是什么?

  2)typeof 和instanceof 的區別是什么和作用是什么?

  3)undefined 和null 有什么區別?

  4)js 有哪幾種基本的數據類型?

  5)Undefined,undefined,’undefined’分別是什么?

  6)typeof null ?,null instanceof Object 的值是什么

關于類型,不同的書上有很多的不同的說法,

  首先看看ECMA 是怎么說的,ECMA262-5上說 ECMAScript的類型是Undefined,Null,Boolean,String,Number,Object,每種類型對應一種值,分別是undefined,null,true/false, "elements",number,

a collection of prototies,每種類型都有一個對應的值,分別為 ‘undefined’,'null','boolean','string','number','object'.這種說法不能解釋function 是什么類型,null 和undefined 的區別

  javascript高級教程第一版(p11頁)中說,js只有5中原始的基本數據類型(Undefined,Null,Boolean,String,Number),很明顯不對。那么,對象是是什么呢?到第二版中,將Object增加進來了,說Object是
一種復雜的數據類型。所有的值都將是上述6種類型之一,我覺得這種說法還靠譜一點,但是如果 是函數呢?這就說不清楚它屬于哪一類了。

  aimingoo 提到javascript中兩套類型系統,一個是基本數據類型,另外一個是對象類型系統,基本數據類型包括6種,分別是undefined,string,null,boolean,function,object,基本數據類型是通過typeof

來檢測的,對象類型系統是以基礎類型系統為基礎的,對象類型系統通過instanceof來檢測,對象類型與基本數據類型存在著對應的關系,例如String->sting, Boolean-> boolean,Number->number,他們只是映射,本質上

是不同的,undefined,string,null,boolean 是值類型的。function,object 是引用類型的。String,Boolean,Number 類均是object類型,是Object的子類。Function() 也是引用類型,所有的引用類型均是Object的子類。

  我覺得通過兩套類型系統理解js中的數據類型是比較靠譜的。首先它通過typeof 和instanceof 來區別基本數據類型和對象類型,不同的對象類型通過 a instanceof Type 來判斷是否是其相應的類型,

例如:alert(typeof null ) 結果是 “object”,但是alert(null instanceof Object) ?結果是false 這個說明null 是對象,但是它不是Object的子類,其次,它能夠解答 “aaaa”.length為什么是4,這個是一個裝箱操作,

當.運算符發現左邊的操作數是一個“值類型”數據時,會隱式地調用Object(x)過程將它轉為對象,于是"aaaa".length 將被隱式地轉化為 String("aaaa").length,而String() 是有length 屬性的,所以有這個值4

回到本文開始處的幾個問題,很明顯都可以解釋了:

  1)如果判斷函數?function 和object的聯系是什么?

?    通過typeof 來判斷,function和object都是引用類型,函數的基本數據類型,object是對象類型,function是object的子類

  2)typeof 和instanceof 的區別是什么和作用是什么?

    typeof 用來判斷基本數據類型,instanceof 來判斷對象類型, 但function 有點特殊 alert(typeof function(){}) //"function" ?alert(function(){} instanceof Object) ?//true

  3)undefined 和null 有什么區別?

    一個是值類型,一個是引用類型

  4)js 有哪幾種基本的數據類型?

    6種:undefined,boolean,string,number,object,function

  5)Undefined,undefined,’undefined’分別是什么?

    Undefined 是類型,undefined 是值,’undefined‘是類型的名稱

  6)typeof null ?,null instanceof Object 的值是什么

    ’object‘ ?,false

歡迎大家拍磚。

轉載于:https://www.cnblogs.com/yupeng/archive/2012/05/22/2512077.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379698.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379698.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379698.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VisualStudio2019配置OpenCV

VisualStudio2019配置OpenCV配置0x01 準備0x02 配置系統環境0x03 復制文件0x04 配置VisualStudio2019測試配置 0x01 準備 下載opencv&#xff0c;官網地址&#xff1a;https://opencv.org/releases/# 下載之后&#xff0c;自行安裝 0x02 配置系統環境 找到高級系統設置 …

轉載 Javascript的IE和Firefox兼容性匯編

微軟關于IE、Firefox、Opera和Safari的JavaScript兼容性研究曾經發表過一份草案,可以點擊下載《JScript Deviations from ES3》 以下為網上的一些搜集和整理(FF代表Firefox) 集合類對象問題現有代碼中存在許多 document.form.item("itemName") 這樣的語句&#xff0c…

存儲器間接尋址方式_8086微處理器的程序存儲器尋址模式

存儲器間接尋址方式The Program Memory Addressing mode is used in branch instructions. These branch instructions are instructions which are responsible for changing the regular flow of the instruction execution and shifting the control to some other location…

Servlet的配置

1&#xff0c;基本配置 <!-- Servlet類的配置 --><servlet><servlet-name>sq</servlet-name><servlet-class>beyond.servlet.QuickStartServlet</servlet-class></servlet><!-- Servlet的虛擬路徑的配置 --> <servlet-mapp…

Asp.net頁面生存周期

# 事件或方法 功能 描述   1 Init 事件 頁面初始化 初始化設置。   2 LoadViewState 方法 加載視圖狀態 填充ViewState屬性。   3 LoadPostData 方法 處理回發數據 處理傳入窗體數據。   4 Load 事件 加載頁面 頁面控件初始化完成并反映了客戶端的數據。   5 RaisePo…

你正確關閉WCF鏈接了嗎?

通常情況下我們關閉一個WCF鏈接都是簡單地寫把ICommunicationObject.Close()方法&#xff0c;但是這個方法有個問題就是當調用發生異常時&#xff0c;Close()會發生次生的異常&#xff0c;導致鏈接不能正常關閉。如果當這種異常很多時&#xff0c;必然對系統的穩定性有很大的影…

Visual Studio進行linux遠程開發

目錄準備工作創建一個項目配置遠程項目準備工作 查看linux IP地址 安裝了工具 sudo apt-get install openssh-server g gdb make ninja-build rsync zip開啟ssh服務&#xff1a; sudo service ssh startVS2019按裝了linux功能&#xff0c;如果沒有&#xff0c;找到Visual S…

在給定總和K的二叉樹中找到級別

Description: 描述&#xff1a; The article describes how to find the level in a binary tree with given sum K? This is an interview coding problem came in Samsung, Microsoft. 本文介紹了如何在給定總和K下在二叉樹中找到級別 &#xff1f; 這是一個面試編碼問題&a…

PostgreSQL學習手冊(數據庫維護) 轉

原文&#xff1a; PostgreSQL學習手冊(數據庫維護)一、恢復磁盤空間&#xff1a;在PostgreSQL中&#xff0c;使用delete和update語句刪除或更新的數據行并沒有被實際刪除&#xff0c;而只是在舊版本數據行的物理地址上將該行的狀態置為已刪除或已過期。因此當數據表中的數據變化…

++i與i++的根本性區別(兩個代碼對比搞定)

首先來看i 代碼如下&#xff1a; #include <stdio.h> #include <stdlib.h> int main() {int i0;int ai;printf("%d\n",a);printf("%d\n\n\n",i);return 0; }輸出結果如下&#xff1a; 解釋&#xff1a;i其實是兩行代碼的簡寫形式&#xff0c…

國企和外企的比較

由于本人在外企&#xff0c;而很多朋友在國企&#xff0c;因此我個人的說法應該還是有一定的權威性。 首先&#xff0c;國企和外企不能一概而論。正如任何事物都有三六九等&#xff0c;這個&#xff0c;只能在同等級別上進行比較。 國企分類&#xff1a; 一等國企&#xff1…

Python | 使用matplotlib.pyplot創建線圖

Problem statement: Write a program in python (using matplotlib.pyplot) to create a line plot. 問題陳述&#xff1a;用python編寫程序(使用matplotlib.pyplot)以創建線圖。 Program: 程序&#xff1a; import matplotlib.pyplot as pltx [1,2,3,4,5,6,7,8,9,10]y [3,…

QI(接口查詢)

接觸AE一段時間了&#xff0c;總的來說收獲不少&#xff0c;今天仔細分析了一下AE開發中經常會用到的QI即接口查詢&#xff0c;有了自己的一些理解。 COM類至少有一個接口。事實上一般它們有好幾個接口。即一個類經常會實現多個接口&#xff08;一個類無法繼承多個類&#xff0…

linux內核設計與實現---從內核出發

獲取、編譯、安裝內核1 獲取內核源碼安裝內核源代碼何處安裝源碼使用補丁2 內核源碼樹3 編譯內核減少編譯的垃圾信息衍生多個編譯作業安裝內核啟用指定內核作為引導4 內核開發的特點沒有libc庫頭文件沒有內存保護機制容積小而固定的棧1 獲取內核源碼 在linux內核官方網站http:…

MySQL在DOS下的基本命令操作

啟動net start mysql 重置root密碼 方法一:在my.ini的[mysqld]字段加入&#xff1a; skip-grant-tables 重啟mysql服務&#xff0c;這時的mysql不需要密碼即可登錄數據庫然后進入mysql mysql>use mysql;mysql>更新 user set passwordpassword(新密碼) WHERE Userroot; …

strlen的神奇實現

https://blog.delphij.net/2012/04/freebsd-strlen3.html 與 Pascal 等語言不同&#xff0c;C 的字符串并不保存串的長度&#xff0c;而是在字符串末尾以 nul 字符&#xff08;\0&#xff09;來表示字符串結束。這個設計決策是上世紀 60 年代作出的&#xff0c;有都市傳說是為了…

python求和_Python程序查找特殊求和系列的解決方案

python求和We are going to design a special sum series function which has following characteristics: 我們將設計一個特殊的求和系列函數&#xff0c;該函數具有以下特征&#xff1a; f(0) 0f(1) 1f(2) 1f(3) 0f(x) f(x-1) f(x-3)Python solution of the above sum…

linux內核設計與實現---進程管理

進程管理1 進程描述符及任務結構分配進程描述符進程描述符的存放進程狀態設置當前進程狀態進程上下文進程家族樹2 進程創建寫時拷貝fork()vfork()3 線程在Linux中的實現內核線程4 進程終結刪除進程描述符孤兒進程造成的進退微谷5 小結進程的另一個名字叫做任務&#xff08;task…

JS錯誤代碼解釋大全+VBS錯誤代碼解釋大全

JScript 運行時錯誤 JScript 運行時錯誤是指當 JScript 腳本試圖執行一個系統不能運行的動作時導致的錯誤。當正在運行腳本、計算變量表達式、或者正在動態分配內存時出現 JScript 運行時錯誤時。 錯誤號 描述 5029 數組長度必須為一有限正整數 5030 必須賦給數組長度一個有…

生日蠟燭(藍橋杯)

某君從某年開始每年都舉辦一次生日party&#xff0c;并且每次都要吹熄與年齡相同根數的蠟燭。 現在算起來&#xff0c;他一共吹熄了236根蠟燭。 請問&#xff0c;他從多少歲開始過生日party的&#xff1f; 請填寫他開始過生日party的年齡數。 注意&#xff1a;你提交的應該是…