數(shù)據(jù)類型、運算符谊惭、流程控制語句

1、JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是原始類型?哪些是復(fù)雜類型?原始類型(或基本數(shù)據(jù)類型)和復(fù)雜類型的區(qū)別是什么?

最新的 ECMAScript 標準定義了 7 種數(shù)據(jù)類型:

  • 6種原始類型(也稱基本數(shù)據(jù)類型):
    • Number:整數(shù)和浮點數(shù)值(所謂浮點數(shù)值,就是該數(shù)值中必須包含一個小數(shù)點圈盔,并且小數(shù)點后面必須至少有一位數(shù)字)豹芯。
    • String:String類型用于表示由零或多個16位Unicode字符組成的字符序列,即字符串驱敲。字符串可以由雙引號或單引號表示铁蹈。
    • Boolean:Boolean類型只有兩個字面值:true和false。
    • Undefined:Undefined類型只有一個值众眨,即特殊的undefined。在使用var聲明變量但未對其初值化時,這個變量的值就是undefined屹堰。對未聲明的變量執(zhí)行typeof操作符同樣也會返回undefined值叔扼。
    • Null:Null類型是第二個只有一個值的數(shù)據(jù)類型,這個特殊的值
      是null姚建。null值表示通常有意地指向不存在或無效的對象或地址的引用矫俺,從邏輯角度看,null值表示一個空對象指針掸冤,而這也正是使用typeof操作符檢測null值時會返回“object”的原因厘托。如果定義的變量準備在將來用于保存對象,那么最好將該變量初始化為null而不是其他值稿湿。
    • Symbol :(ECMAScript 6 新定義)
  • 1種復(fù)雜數(shù)據(jù)類型:
    • Object:ECMAScript中的對象其實就是一組數(shù)據(jù)功能的集合铅匹。對象可以通過執(zhí)行new操作符后跟要創(chuàng)建的對象類型的名稱來創(chuàng)建。Object有三個子類型狹義的對象- 正則表達式(regexp)饺藤,數(shù)組(array)包斑,函數(shù)(function)。

原始類型(或基本數(shù)據(jù)類型)和復(fù)雜類型的區(qū)別:

  1. 在內(nèi)存中的存儲方式:
    基本數(shù)據(jù)類型把數(shù)據(jù)名和值直接存儲在棧當中涕俗。
    復(fù)雜數(shù)據(jù)類型在棧中存儲數(shù)據(jù)名和一個堆的地址罗丰,在堆中存儲屬性及值。訪問時先從棧獲取地址再姑,再到堆中拿出相應(yīng)的值萌抵。

  2. 不同數(shù)據(jù)類型作為參數(shù)時,函數(shù)內(nèi)部對參數(shù)的修改是否改變外部變量的值
    (1)基本數(shù)據(jù)類型作為參數(shù)時元镀,函數(shù)內(nèi)部對參數(shù)值的修改不會改變外部變量的值

function a(s){//定義以s為參數(shù)的函數(shù)绍填,返回s的值


    s=100;


    return s;


    }


    var y=1;


    a(y);//y作為參數(shù)調(diào)用函數(shù)a


    console.log(y);//y還是為1

結(jié)果還是1因為把y的值給s時是簡單的復(fù)制了一份,y和s可以單獨操作不相互影響

(2)復(fù)雜數(shù)據(jù)類型作為參數(shù)時栖疑,函數(shù)內(nèi)部對參數(shù)值的修改會改變外部變量的值

因為復(fù)雜數(shù)據(jù)類型賦值是把棧中對象的地址賦給變量讨永,函數(shù)內(nèi)外兩個變量指向同一個對象,所以只要對象的屬性值改變遇革,兩個變量值都會改變

function student(age,name,agrde){


    this.age=age;


    this.name=name;


    this.score=agrde;


    }




    var s1=new student(18,"wjq",2);//創(chuàng)建一個student對象

    function a(s){


    s.name=”xxx”;


    }


    a(s1)//把s1賦給s


    console.log(s1.name);//輸出xxx

原始類型和對象的區(qū)別主要還是在內(nèi)存中的保存形式卿闹,要弄懂js中簡單數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型的區(qū)別揭糕,關(guān)鍵還要搞懂兩個在內(nèi)存中的存儲過程。

2.typeof和instanceof的作用和區(qū)別?

JavaScript有三種方法锻霎,可以確定一個值到底是什么類型插佛。

  • typeof 運算符
  • instanceof 運算符
  • Object.prototype.toString.call() 方法

typeof 運算符

最常用的是 typeof 運算符,返回一個值的數(shù)據(jù)類型有以下幾種結(jié)果:

  • "undefined" : 如果一個變量沒有聲明量窘,或聲明了而沒有初始化雇寇;
// 變量聲明了,但沒有賦值
var i;
i // undefined

// 調(diào)用函數(shù)時蚌铜,應(yīng)該提供的參數(shù)沒有提供锨侯,該參數(shù)等于undefined
function f(x) {
  return x;
}
f() // undefined

// 對象沒有賦值的屬性
var  o = new Object();
o.p // undefined

// 函數(shù)沒有返回值時,默認返回undefined
function f() {}
f() // undefined
  • "boolean" : 如果這個值是布爾值冬殃;
typeof false // "boolean"
typeof true // "boolean"
  • "string" : 如果這個值是字符串囚痴;
typeof '345' // "string"
  • "number" : 如果這個值是數(shù)值;
typeof 345 // "number"
  • "object" : 如果這個值是對象(包括數(shù)組审葬、正則表達式)或null深滚;
var s1=new Object();
typeof s1 //"object"

var arr1=[1,2,3];
typeof arr1 //"object"

var pattern= /at/g;
typeof pattern //"object"

typeof null // "object"
  • "function" : 如果這個值是函數(shù)。
var f= function() {};
typeof f //"function"

注意:

  • null的返回值是object涣觉,這是由于歷史原因造成的痴荐,1995年JavaScript語言的第一版,所有值都設(shè)計成32位官册,其中最低的3位用來表述數(shù)據(jù)類型生兆,object對應(yīng)的值是000。當時膝宁,只設(shè)計了五種數(shù)據(jù)類型(對象鸦难、整數(shù)、浮點數(shù)员淫、字符串和布爾值)合蔽,完全沒考慮null,只把它當作object的一種特殊值介返,32位全部為0拴事。這是typeof null返回object的根本原因。
    為了兼容以前的代碼映皆,后來就沒法修改了挤聘。這并不是說null就屬于對象轰枝,本質(zhì)上null是一個類似于undefined的特殊值捅彻。

instanceof 運算符

instanceof是判斷指定對象是否為某個構(gòu)造函數(shù)的實例,返回值是truefalse鞍陨。

var v = new Object();
v instanceof Object // true

上面代碼中步淹,對象v是構(gòu)造函數(shù)Object的實例从隆,所以返回true。

instanceof運算符的左邊是實例對象缭裆,右邊是構(gòu)造函數(shù)键闺。它會檢查右邊構(gòu)建函數(shù)的原型對象,是否在左邊對象的原型鏈上澈驼。因此辛燥,下面兩種寫法是等價的。

v instanceof Object
// 等同于
Object.prototype.isPrototypeOf(v)

由于instanceof對整個原型鏈上的對象都有效缝其,因此同一個實例對象挎塌,可能會對多個構(gòu)造函數(shù)都返回true。

var d = new Date();
d instanceof Date // true
d instanceof Object // true

上面代碼中内边,d同時是Date和Object的實例榴都,因此對這兩個構(gòu)造函數(shù)都返回true。
instanceof的原理是檢查原型鏈漠其,對于那些不存在原型鏈的對象嘴高,就無法判斷。

null instanceof Object // false

由于null 沒有 prototype和屎,即不存在原型拴驮,因此instanceof就認為該對象不是Object的實例。

JavaScript 之中柴信,只要是對象莹汤,就有對應(yīng)的構(gòu)造函數(shù)。因此颠印,instanceof運算符的一個用處纲岭,是判斷值的類型。

var x = [1, 2, 3];
var y = {};
x instanceof Array // true
y instanceof Object // true

上面代碼中线罕,instanceof運算符判斷止潮,變量x是數(shù)組,變量y是對象钞楼。

注意喇闸,instanceof運算符只能用于對象,不適用原始類型的值询件。

var s = 'hello';
s instanceof String // false

上面代碼中燃乍,字符串不是String對象的實例(因為字符串不是對象),所以返回false宛琅。

此外刻蟹,對于undefined和null,instanceOf運算符總是返回false嘿辟。

undefined instanceof Object // false
null instanceof Object // false

用法上的區(qū)別:

typeof 對數(shù)組 [] 和對象 {} 的返回值都是Object舆瘪,無法區(qū)分數(shù)組和對象片效,但是instanceof可以區(qū)分。

var a = {};
var b=[];
typeof a // "object"
typeof b // "object"
a instanceof Array // false
a instanceof Object // true
b instanceof Array // true
b instanceof Object // true

3英古、如何判斷一個變量是否是數(shù)字淀衣、字符串、布爾召调、函數(shù)

使用typeof 運算符可以判斷一個變量是否是數(shù)字膨桥、字符串、布爾唠叛、函數(shù)国撵。

數(shù)字

var a=1;
typeof a // 'number'

字符串

var b="string";
typeof b // "string"

布爾

var c=true;
typeof c //true

函數(shù)

var f=function() {};
typeof f // "function"

4.NaN是什么? 有什么特別之處?

(1)含義

NaN是 JavaScript 的特殊值,表示“非數(shù)字”(Not a Number)玻墅,主要出現(xiàn)在將字符串解析成數(shù)字出錯的場合介牙。

100 - 'a' // NaN

上面代碼運行時,會自動將字符串a(chǎn)轉(zhuǎn)為數(shù)值澳厢,但是由于a不是數(shù)值环础,所以最后得到結(jié)果為NaN,表示它是“非數(shù)字”(NaN)剩拢。

需要注意的是线得,NaN不是一種獨立的數(shù)據(jù)類型,而是一種特殊數(shù)值徐伐,它的數(shù)據(jù)類型依然屬于Number贯钩,使用typeof運算符可以判斷出來。

typeof NaN // 'number'

(2)特別之處

NaN不等于任何值办素,包括它本身角雷。

NaN === NaN // false

由于數(shù)組的indexOf方法,內(nèi)部使用的是嚴格相等運算符性穿,所以該方法對NaN不成立勺三。

[NaN].indexOf(NaN) // -1

NaN在布爾運算時被當作false。

Boolean(NaN) // false

NaN與任何數(shù)(包括它自己)的運算需曾,得到的都是NaN吗坚。

NaN + 12 // NaN
NaN - 12 // NaN
NaN * 12 // NaN
NaN / 12 // NaN

(3)判斷NaN的方法

isNaN方法可以用來判斷一個值是否為NaN。isNaN()函數(shù)接受一個參數(shù)呆万,該參數(shù)可以是任何類型商源,而函數(shù)會判斷這個參數(shù)是否"不是數(shù)值"。isNaN()在接收到一個值之后谋减,會嘗試將這個值轉(zhuǎn)換為數(shù)值牡彻。某些不是數(shù)值的值會直接轉(zhuǎn)換為數(shù)值,例如"10"和"Boolean"逃顶。而任何不能被轉(zhuǎn)換為數(shù)值的值都會導(dǎo)致這個函數(shù)返回true讨便。

isNaN(NaN) // true
isNaN(123) // false
isNaN("123") // false
isNaN("123string") // true

isNaN只對數(shù)值有效,如果傳入其他值以政,會被先轉(zhuǎn)成數(shù)值霸褒。

出于同樣的原因,對于對象和數(shù)組盈蛮,isNaN也返回true废菱。

isNaN({}) // true
// 等同于
isNaN(Number({})) // true

isNaN(['xzy']) // true
// 等同于
isNaN(Number(['xzy'])) // true

但是,對于空數(shù)組和只有一個數(shù)值成員的數(shù)組抖誉,isNaN返回false殊轴。

isNaN([]) // false
isNaN([123]) // false
isNaN([123,567]) // true
isNaN(['123']) // false

上面代碼之所以返回false,原因是這些數(shù)組能被Number函數(shù)轉(zhuǎn)成數(shù)值袒炉。

判斷NaN更可靠的方法是旁理,利用NaN是JavaScript之中唯一不等于自身的值這個特點,進行判斷我磁。

function IsNaN(value) {
  return value !== value;
}

5.如何把非數(shù)值轉(zhuǎn)化為數(shù)值?

有三個函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:

  • Number()
  • parseInt()
  • parseFloat()

Number()

轉(zhuǎn)型函數(shù)Number()可以用于任何數(shù)據(jù)類型孽文,而另外兩個函數(shù)則專門用于把字符串轉(zhuǎn)換成數(shù)值。

Number函數(shù)的轉(zhuǎn)換規(guī)則:

  1. 如果是Boolean值夺艰,true 返回 1芋哭,false 返回 0 。
Number(true)    //1
Number(false)   //0
  1. 如果是數(shù)字值郁副,就是原樣减牺。
Number(3.14)    //3.14
  1. 如果是null值,返回0存谎。
Number(null) // 0
  1. 如果是undefined拔疚,返回NaN。
Number(undefined) // 0

5.如果是字符串既荚,遵循下列規(guī)則:

  • 如果是字符串中只包含數(shù)字(包括前面帶正號或負號的情況)草雕,則將其轉(zhuǎn)化成十進制數(shù)值。
Number ('23')    // 23
Number ('+23')   // 23 
Number ('-23')   // -23
Number ('011')   // 11  前面的0會忽略
  • 如果字符串中包含的有效的浮點數(shù)固以,就會轉(zhuǎn)化成對應(yīng)的浮點數(shù)墩虹,前面的0會忽略。
Number ('3.14')    //3.14
Number ('03.14')   //3.14
  • 如果字符串中包含有效的十六進制格式憨琳,前兩位為"0x..."的格式诫钓,會自動轉(zhuǎn)化成相同大小的十進制數(shù)。
Number ('0x10')  // 16
  • 如果字符串是空字符串篙螟,則返回 0菌湃。
Number ('')  // 0
  • 如果字符串中包含除上述格式外的其他字符,則轉(zhuǎn)化成NaN遍略。
Number("123blue")  // NaN
Number(message)  // NaN,變量message未聲明
  • 如果是對象惧所,則調(diào)用對象的valueOf()方法骤坐,然后依照前面的規(guī)則轉(zhuǎn)換返回的值。如果轉(zhuǎn)換的結(jié)果是NaN下愈,則調(diào)用對象的toString()方法纽绍,然后再依照前面的規(guī)則轉(zhuǎn)換字符串返回的字符串值。

parseInt()

  • parseInt方法用于將字符串轉(zhuǎn)為整數(shù)势似。返回值只有兩種可能拌夏,不是一個十進制整數(shù),就是NaN履因。
parseInt ('120')       //120   整數(shù)轉(zhuǎn)化成整數(shù)
parseInt ('3.14')    //3     浮點數(shù)轉(zhuǎn)化前面的整數(shù)部分
parseInt ('    10')    //10    前面的空格會忽略
parseInt ('000010')    //10    前面的0會忽略
  • 如果parseInt的參數(shù)不是字符串障簿,則會先轉(zhuǎn)為字符串再轉(zhuǎn)換。
parseInt(1.23) // 1
// 等同于
parseInt('1.23') // 1
  • 字符串轉(zhuǎn)為整數(shù)的時候栅迄,是一個個字符依次轉(zhuǎn)換站故,如果遇到不能轉(zhuǎn)為數(shù)字的字符,就不再進行下去毅舆,返回已經(jīng)轉(zhuǎn)好的部分世蔗。
parseInt('8a') // 8
parseInt('12**') // 12
parseInt('12.34') // 12
parseInt('15e2') // 15
parseInt('15px') // 15
//上面代碼中,parseInt的參數(shù)都是字符串朗兵,結(jié)果只返回字符串頭部可以轉(zhuǎn)為數(shù)字的部分污淋。
  • 如果字符串的第一個字符不能轉(zhuǎn)化為數(shù)字(后面跟著數(shù)字的正負號除外),返回NaN余掖。
parseInt('abc')   // NaN
parseInt('.3')    // NaN
parseInt('')      // NaN
parseInt('+')     // NaN
parseInt('+1')    // 1
  • parseInt方法還可以接受第二個參數(shù)(2到36之間)寸爆,表示被解析的值的進制,返回該值對應(yīng)的十進制數(shù)盐欺。默認情況下赁豆,parseInt的第二個參數(shù)為10,即默認是十進制轉(zhuǎn)十進制冗美。
parseInt('1000', 10)    // 1000  以十進制解讀(默認)
parseInt('1000', 2)     // 8    以二進制解讀
parseInt('1000', 6)     // 216   以六進制解讀
parseInt('1000', 8)     // 512   以八進制解讀
parseInt('10', 37) // NaN   進制超出范圍魔种,就返回 NaN
parseInt('10', 1) // NaN  進制超出范圍,就返回 NaN
parseInt('10', 0) // 10
parseInt('10', null) // 10
parseInt('10', undefined) // 10  第二個參數(shù)是0粉洼、null节预、undefined 則直接忽略

parseFloat ()

  • parseFloat用于將一個字符串轉(zhuǎn)為浮點數(shù)。
parseFloat('3.14')         // 3.14  浮點數(shù)轉(zhuǎn)浮點數(shù)
parseFloat('314e-2')       // 3.14  
parseFloat('0.0314E+2')    // 3.14  如果字符串符合科學(xué)計數(shù)法属韧,則進行相應(yīng)轉(zhuǎn)換
parseFloat ('3.14abc')     // 3.14  如果字符串包含不能轉(zhuǎn)換為浮點數(shù)的字符安拟,則不再往后轉(zhuǎn)換,返回已經(jīng)轉(zhuǎn)好的部分宵喂。
parseFloat ('    3.14')    // 3.14
parseFloat ('00003.14')    // 3.14  parseFloat方法會自動過濾字符串前面的空格
  • 如果參數(shù)不是字符串糠赦,或者字符串的第一個字符不能轉(zhuǎn)換為浮點數(shù),則返回NaN。
parseFloat([])     // NaN  空數(shù)組返回 NaN
parseFloat('FF2')  // NaN  第一個字符不能轉(zhuǎn)化浮點數(shù)
parseFloat('')     // NaN  空字符串轉(zhuǎn)化為 NaN

parseFloat () 和 Number () 的區(qū)別

parseFloat(true)       // NaN
Number(true)           // 1

parseFloat(null)       // NaN
Number(null)           // 0

parseFloat('')         // NaN
Number('')             // 0

parseFloat('123.45#')  // 123.45
Number('123.45#')      // NaN

parseInt()與parseFloat()的區(qū)別

區(qū)別(1):parseFloat()轉(zhuǎn)換時拙泽,第一個小數(shù)點有效,小數(shù)點對parseInt()無效

parseFloat("22.34.5") //22.34
parseInt("22.34.5") //22

區(qū)別(2):parseFloat()始終會忽略前導(dǎo)的0

parseFloat()可以識別前面討論過的所有浮點數(shù)值格式淌山,也包括十進制整數(shù)格式。但十六進制格式的字符串則始終會被轉(zhuǎn)換成0顾瞻。由于parseFloat()直解析十進制值泼疑,因此它沒有用第二個參數(shù)指定基數(shù)的用法。最后還要注意一點朋其,如果字符串包含的是一個可解析為整數(shù)的數(shù)(沒有小數(shù)點王浴,或者小數(shù)點后都是0)脆炎,parseFloat()會返回整數(shù)梅猿。

parseFloat("1234blue") //1234
parseFloat("0xA") //0
parseFloat("22.5") //22.5
parseFloat(22.34.5) //22.34
parseFloat("0908.5") //908.5
parseFloat("3.125e7") //31250000
parseFloat("4.0000") //4

6.==與===有什么區(qū)別

歷史背景

確定兩個變量是否相等是編程中的一個非常重要的操作。在比較字符串秒裕、數(shù)值和布爾值的相等性時袱蚓,問題還比較簡單。但在涉及到對象的比較時几蜻,問題就變得復(fù)雜了喇潘。最早的ECMAScript中的相等和不等操作符會在執(zhí)行比較之前,先將對象轉(zhuǎn)換成相似的類型梭稚。后來,有人提出了這種轉(zhuǎn)換到底是否合理的質(zhì)疑颖低。最后,ECMAScript的解決方案就是提供兩組操作數(shù):相等不相等——先轉(zhuǎn)換在比較弧烤,全等不全等——僅比較而不轉(zhuǎn)換忱屑。

1.相等和不相等

這兩個操作符都會先轉(zhuǎn)換操作數(shù),然后再比較它們的相等性暇昂。

在轉(zhuǎn)換不同的數(shù)據(jù)類型時莺戒,相等和不相等操作符遵循下列基本規(guī)則:

  • 如果有一個操作數(shù)是布爾值,則在比較相等性之前先將其轉(zhuǎn)換為數(shù)值——false轉(zhuǎn)換為0急波,而true轉(zhuǎn)換為1从铲;
false == 1 //false
false == 0 //true
true ==1 //true
true == 0 //false
  • 如果一個操作數(shù)是字符串,另一個操作數(shù)是數(shù)值澄暮,在比較相等性之前先將字符串轉(zhuǎn)換為數(shù)值名段;
"123" == 123 //true
  • 如果一個操作數(shù)是對象,另一個操作數(shù)不是泣懊,則調(diào)用對象的valueof()方法吉嫩,用得到的基本類型值按照前面的規(guī)則進行比較;

這兩個操作符在進行比較時則要遵循下列規(guī)則嗅定。

  • null和undefined是相等的自娩。
null == undefined //true
  • 要比較相等性之前,不能將null和undefined轉(zhuǎn)換成其他任何值
null +1 //1
undefined +1 //NaN
null == 0 //false
undefined == 0 //false
  • 如果有一個操作數(shù)是NaN忙迁,則相等操作符返回false脐彩,而不相等操作符返回true。
"NaN" == NaN //false
NaN == NaN //false
NaN != NaN //true
  • 如果兩個操作數(shù)都是對象姊扔,則比較它們是不是同一個對象惠奸。如果兩個操作數(shù)都指向同一個對象,則相等操作符返回true恰梢;否則返回false佛南。

2.全等和不全等

全等操作符只在兩個操作數(shù)未經(jīng)轉(zhuǎn)換就相等的情況下返回true。

除了在比較之前不轉(zhuǎn)換操作數(shù)之外嵌言,全等和不全等操作符與相等和不相等操作符沒有什么區(qū)別嗅回。

"55" == 55 //true,因為轉(zhuǎn)換后相等
"55" === 55 //false摧茴,因為在不轉(zhuǎn)換的情況下绵载,字符串不等于數(shù)值
null ==undefined //true
null === undefined //false

記住,null ==undefined會返回true苛白,因為它們是類似的值娃豹;但null === undefined會返回false,因為它們是不同類型的值购裙。

7.break與continue有什么區(qū)別

  • break語句立即退出循環(huán)懂版,強制執(zhí)行循環(huán)后面的語句(退出循環(huán)體)
var num = 0;
for (var i=1; i<10; i++) {
    if (i % 5 == 0) {
      break;
  }
  num++;
}
alert(num); //4
  • continue語句立即退出本次循環(huán),執(zhí)行下次循環(huán)(退出單次循環(huán))
var num = 0;
for (var i=1; i<10; i++) {
    if (i % 5 == 0) {
      continue;
  }
  num++;
}
alert(num); //8

break和continue語句都可以與label語句聯(lián)合使用躏率,從而返回代碼中特定的位置躯畴。這種聯(lián)合使用的情況多發(fā)生在循環(huán)嵌套的情況下。

  • break語句與label語句聯(lián)合使用
var num = 0;
outermost :
for (var i=0; i<10; i++) {
    for (var j=0; j<10; j++) {
        if (i ==5 && j == 5) {
            break outermost;
        }
        num++;
    }
}
alert(num);  //55

break語句后面帶了一個參數(shù):要返回到的標簽禾锤。添加這個標簽的結(jié)果將導(dǎo)致break語句不僅會退出內(nèi)部的for語句(使用變量j的循環(huán))私股,而且也會退出外部的for語句(使用變量i的循環(huán))。

var num = 0;
outermost :
for (var i=0; i<10; i++) {
    for (var j=0; j<10; j++) {
        if (i ==5 && j == 5) {
            break;
        }
        num++;
    }
}
alert(num);  //95
  • continue語句與label語句聯(lián)合使用
var num = 0;
outermost :
for (var i=0; i<10; i++) {
    for (var j=0; j<10; j++) {
        if (i ==5 && j == 5) {
            continue outermost;
        }
        num++;
    }
}
alert(num);  //95

continue語句后面帶了一個參數(shù):要返回到的標簽恩掷。添加這個標簽的結(jié)果將導(dǎo)致continue語句會退出內(nèi)部循環(huán)(這也就意味著內(nèi)部循環(huán)少執(zhí)行了5次)倡鲸,執(zhí)行下一次外部循環(huán)(continue退出的是單次循環(huán),繼續(xù)執(zhí)行下一次循環(huán))黄娘。

var num = 0;
outermost :
for (var i=0; i<10; i++) {
    for (var j=0; j<10; j++) {
        if (i ==5 && j == 5) {
            continue; 
        }
        num++;
    }
}
alert(num);  //99

8.void 0 和 undefined在使用場景上有什么區(qū)別

undefined

  1. undefined 并不是保留詞(reserved word)峭状,它只是全局對象的一個屬性,在低版本 IE 中能被重寫逼争。
var undefined = 10;
 
// undefined -- chrome
// 彈出10 -- IE 8优床,低版本IE中
alert(undefined);
  1. 雖然undefined 在 ES5 中已經(jīng)是全局對象的一個只讀(read-only)屬性,它不能被重寫誓焦。但是在局部作用域中胆敞,還是可以被重寫。
(function() {

  //局部作用域
  var undefined = 10;
 
  //彈出 10 -- chrome
  alert(undefined);
})();
 
(function() {

  //全局變量并賦值,因為在全局作用域undefiend不能被重寫移层,所以賦值無效
  undefined = 10;
 
  // 彈出undefined -- chrome
  alert(undefined);
})();

void運算符

void 運算符能對給定的表達式進行求值仍翰,然后返回 undefined。

也就是說观话,void 后面你隨便跟上一個表達式予借,返回的都是 undefined,都能完美代替 undefined频蛔。

那么灵迫,這其中最短的是什么呢?毫無疑問就是 void 0 了晦溪。其實用 void 1瀑粥,void (1+1),void (0) 或者 void “hello”尼变,void (new Date()) 等等利凑,都是一樣的效果浆劲。更重要的前提是嫌术,void 是不能被重寫的(cannot be overidden)

ES5 大環(huán)境下牌借,void 0 也有可以發(fā)揮作用的地方度气,用 void 0 代替 undefined 就能節(jié)省不少字節(jié)的大小。事實上膨报,不少 JavaScript 壓縮工具在壓縮過程中磷籍,正是將 undefined 用 void 0 代替掉了。

9.代碼練習(xí)

(1)以下代碼的輸出結(jié)果是?為什么?

console.log(1+1);//輸出2现柠,兩個數(shù)字加法運算
console.log("2"+"4");//輸出'24'院领,兩個字符串類型的做字符串拼接
console.log(2+"4");//輸出'24',一個是數(shù)字一個是字符串够吩,數(shù)字轉(zhuǎn)化為字符串后拼接
console.log(+"4");//輸出4比然,只有一個字符串會轉(zhuǎn)換成數(shù)字輸出
var a = 1;  
a+++a;  
// 3     等同于 (a++)+a,這里前面的(a++)為1,后面的a為2周循,++優(yōu)先級高于+
typeof a+2;  
// 'number2'   等同于(typeof a)+2强法,前面為字符串‘number’,后面數(shù)值湾笛,拼接成字符串饮怯,typeof 優(yōu)先級高于+
 var a = 1;
 var b = 3;
 console.log( a+++b );  
 // 4  括號里面等同于(a++)+b,前面的(a++)表達式值為1嚎研,先用a的值蓖墅,用完后再給a自加1

(2)遍歷數(shù)組,把數(shù)組里的打印數(shù)組每一項的平方

var arr = [3,4,5]

for (var i=0;i<3;i++){
  console.log(arr[i]*arr[i])
}
// 9  16  25

(3)遍歷 JSON, 打印里面的值

var obj = {
 name: 'hunger', 
 sex: 'male', 
 age: 28 
}
for(a in obj){
console.log(a+":"+obj[a])
}
// name:hunger sex:male age:28

(4)下面代碼的輸出結(jié)果

var a = 1, b = 2, c = 3;
var val = typeof a + b ||  c >0    //  優(yōu)先級順序typeof   +  >   ||
console.log(val)    //  'number2' || true
// 輸出‘number2’

var d = 5;
var data = d ==5 && console.log('bb')  
// console.log('bb') 輸出了字符串bb,但它的返回值是undefined
console.log(data)  // data = true && undefined
//輸出 undefined

var data2 = d = 0 || console.log('haha')  
    // console.log('haha') 輸出了字符串haha论矾,但它的返回值是undefined
console.log(data2)  // data2 = d = 0 || undefined
    //輸出 undefined

var x = !!"Hello" + (!"world", !!"from here!!");  
    // true+(false, true)于樟,即true+true
console.log(x)  //  console.log (true+true)
    // 輸出 2

補充:

逗號運算符用于對兩個表達式求值,并返回后一個表達式的值拇囊。

'a', 'b' //返回"b"

var x = 0;
var y = (x++, 10);
x //1
y  //10

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迂曲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子寥袭,更是在濱河造成了極大的恐慌路捧,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件传黄,死亡現(xiàn)場離奇詭異杰扫,居然都是意外死亡,警方通過查閱死者的電腦和手機膘掰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門章姓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人识埋,你說我怎么就攤上這事凡伊。” “怎么了窒舟?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵系忙,是天一觀的道長。 經(jīng)常有香客問我惠豺,道長银还,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任洁墙,我火速辦了婚禮蛹疯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘热监。我一直安慰自己捺弦,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布狼纬。 她就那樣靜靜地躺著羹呵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疗琉。 梳的紋絲不亂的頭發(fā)上冈欢,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音盈简,去河邊找鬼凑耻。 笑死太示,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的香浩。 我是一名探鬼主播类缤,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼邻吭!你這毒婦竟也來了餐弱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤囱晴,失蹤者是張志新(化名)和其女友劉穎膏蚓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畸写,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡驮瞧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了枯芬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片论笔。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖千所,靈堂內(nèi)的尸體忽然破棺而出狂魔,到底是詐尸還是另有隱情,我是刑警寧澤真慢,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布毅臊,位于F島的核電站理茎,受9級特大地震影響黑界,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜皂林,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一朗鸠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧础倍,春花似錦烛占、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至德迹,卻和暖如春芽卿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胳搞。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工卸例, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留称杨,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓筷转,卻偏偏與公主長得像姑原,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子呜舒,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容