JavaScript基本概念(語法、關(guān)鍵字、變量、數(shù)據(jù)類型)

包含語法、操作符、數(shù)據(jù)類型、內(nèi)置功能
適用ECMAScript 3

語法

大小寫敏感(一切名字都敏感,包括不限于變量名,函數(shù)名,操作符名等)

標(biāo)識(shí)符

由字母(包含擴(kuò)展ASCII字母和Unicode字母),數(shù)字,下劃線,美元符號組合組成
規(guī)則1:第一個(gè)字符不能是數(shù)字
規(guī)則2:不能用保留字和關(guān)鍵詞

駝峰命名法是最佳實(shí)踐

注釋

C風(fēng)格注釋

//單行注釋
/*
 * 多行注釋
 */
嚴(yán)格模式

ES5中引入 嚴(yán)格模式
在腳本首行加入

"use strict";

其實(shí)是條編譯器指令(pragma)
也可在函數(shù)中單獨(dú)使用

function doSomething(){
    "use strict";
}
語句

加不加分號都行,但是需要讓解釋器能夠確定語句結(jié)束(比如換行)
但是最好加上分號,比如壓縮代碼時(shí),調(diào)試時(shí)等

可以使用{}把多條語句組合成代碼塊,在if,while等中最好用{}擴(kuò)住,以防止不必要的錯(cuò)誤

關(guān)鍵字和保留字

abstract
boolean break byte
case catch char class const continue
debugger default delete do double
else enum export extends
false final finally float for function
if implements import in instanceof int interface
long
native new null
package private protected public
short static super switch synchronized
this throw throws transient true try typeof
var void volatile
while with

了解即可

變量

JavaScript是類型松散型,一個(gè)變量名可以表示多種變量類型,比方說 鴨蛋兒 這個(gè)名字,既可以表示吃的鴨蛋,也可以表示人

如何定義一個(gè)變量:

var message;

定義個(gè)名字為message的變量,在沒有值之前,message有特殊值——undefined,表示值不明確

變量初始化:

var message = "空尼奇瓦";

并不會(huì)把message的類型限定為string,只是此時(shí)為string,還可以賦值為別的類型

message = 100

可以這么做,但是不推薦

作用域問題
function test(){
  var message = "hi";
}

message作用域在函數(shù)test中
超出作用域訪問會(huì)報(bào)錯(cuò)

test();
alert(message);//報(bào)錯(cuò) Uncaught ReferenceError: a is not defined

省略var即可創(chuàng)造全局變量

function test(){
  message = "hi";
}
test();
alert(message);

注意點(diǎn):test函數(shù)被調(diào)用message才會(huì)聲明,只寫message不給值,報(bào)錯(cuò)
不推薦使用

聯(lián)合聲明
var message = "hi",
    found = false,
    age = 29;

寫成多行便于閱讀,非必須

數(shù)據(jù)類型

ECMAScript中有6種數(shù)據(jù)類型,簡單類型(也稱基本)有5種:undefined、null、boolean、numberstring,復(fù)合數(shù)據(jù)類型有1種:object

typeof

返回變量的類型,typeof是操作符,不是函數(shù)
6種可能值undefined boolean number string object function,為毛沒有null類型,反而多一個(gè) function類型,nullfunction其實(shí)都是 object 類型,但是null沒有特殊返回一種類型,function特殊返回function,并沒有返回object,注意,之前各瀏覽器實(shí)現(xiàn)不同

undefined

undefined類型只有一個(gè)值undefined。在聲明了一個(gè)變量,但是沒有賦值時(shí),為undefined

var message;//undefined
age;//Uncaught ReferenceError: age is not defined

注意區(qū)別

var message;//undefined
alert(typeof message + typeof age);

執(zhí)行typeof,都返回undefined,這就尷尬了,書上說,這合理,我們要做的是,為每個(gè)已經(jīng)聲明的變量顯式賦值,這樣返回undefined時(shí),我們就能知道這個(gè)值是未聲明過了,因?yàn)橐呀?jīng)聲明賦值過的變量不會(huì)返回undefined

null類型

null類型有一個(gè)值null,表示空對象指針,但是typeof null返回object,合理
最好把一個(gè)將來用作對象類型的變量初始化為null,因?yàn)檫@樣我們就可以用if(xxx != null)來判斷對象有沒有值,假如不怎么做,還有一個(gè)undefined
undefined派生自null

所以

null == undefined//為true
boolean類型

boolean有兩個(gè)值 truefalse
所有類型的值都可以轉(zhuǎn)化為boolean類型,使用Boolean()函數(shù)
返回false的有,""(空串),0NaN,null,undefined
其他返回true
在控制流語句中會(huì)自動(dòng)轉(zhuǎn)換

number類型

包含整數(shù)和浮點(diǎn)數(shù)(雙精度)

整數(shù)

默認(rèn)為十進(jìn)制

var intNum = 10;//整數(shù)10進(jìn)制10

整數(shù)還有8進(jìn)制和16進(jìn)制表示法,8進(jìn)制前綴為0,16進(jìn)制前綴為0x或則0X,另外在8進(jìn)制表示法中出現(xiàn)0-7之外的數(shù)字,8進(jìn)制會(huì)被當(dāng)做10進(jìn)制解析

var a = 10 //10進(jìn)制的10
var b = 010 //8進(jìn)制的8
var c = 0x10 //16進(jìn)制的16
var d = 08 // 會(huì)被當(dāng)做 10進(jìn)制的8,因?yàn)槌隽?-7

8進(jìn)制字面量在嚴(yán)格模式下無效
在進(jìn)行算術(shù)計(jì)算時(shí),結(jié)果都為10進(jìn)制
JavaScript可以保存+0-0,二者相等

浮點(diǎn)數(shù)

帶有小數(shù)點(diǎn),并且小數(shù)點(diǎn)后至少必須有一位不為0的數(shù)字

var a = 1.1;//浮點(diǎn)數(shù)1.1
var b = 0.1;//浮點(diǎn)數(shù)0.1
var c = .1;//浮點(diǎn)數(shù)0.1,這種寫法不推薦

浮點(diǎn)數(shù)內(nèi)存是整數(shù)兩倍,所以為了節(jié)省空間,JavaScript會(huì)把可以當(dāng)做整數(shù)的數(shù)當(dāng)做整數(shù)

var a = 0.0 //整數(shù)0
var b = 1.0 //整數(shù)1

對于極大和極小值,JavaScript使用科學(xué)計(jì)數(shù)法

var a = 3.14e7 // 3.14乘以10的7次方
var b = 3.14e-7 // 3.14乘以10的-7次方

ECMAScript會(huì)把小數(shù)點(diǎn)后面帶有6個(gè)0以上的浮點(diǎn)數(shù)轉(zhuǎn)換為e表示法,如0.0000003會(huì)被轉(zhuǎn)換成3e-7
浮點(diǎn)數(shù)最高精度為17位小數(shù)(有效數(shù)字,從左起第一個(gè)不為0的數(shù)算起到末尾的個(gè)數(shù)),用浮點(diǎn)數(shù)做運(yùn)算和比較操作是不準(zhǔn)確的,這屬于浮點(diǎn)數(shù)在計(jì)算機(jī)中的表示法決定的

數(shù)值范圍

ECMAScript能夠表示的最大數(shù)值為Number.MAX_VALUE(1.7976931348623157e+308),最小數(shù)值為Number.MIN_VALUE(5e-324),如果超出這兩個(gè)范圍,會(huì)被轉(zhuǎn)換成Infinity(正無窮),或-Infinity(負(fù)無窮),正負(fù)無窮無法參與計(jì)算,isFinite()可以判斷是不是有窮,另外,正負(fù)無窮被保存在Number.NEGATIVE_INFINITYNumber.POSITIVE_INFINITY

NaN

非數(shù)值(Not a Number)是個(gè)特殊的數(shù)值,數(shù)值/0 就會(huì)得到NaN,這個(gè)值有兩個(gè)特點(diǎn)
1、與任何值計(jì)算都會(huì)返回NaN
2、與任何值都不相等,包括自身
函數(shù)isNaN()來判斷是不是NaN,該函數(shù)接受一個(gè)參數(shù),參數(shù)可以是任何類型

isNaN(NaN);//true
isNaN(10);//false 10
isNaN("10");//false 10
isNaN("blue");//true
isNaN(true);//false 1
isNaN('true');//true
數(shù)值轉(zhuǎn)換

三個(gè)函數(shù) Number()parseInt(),parseFloat()。
Number()把可用于任意類型,parseInt()parseInt()專門用于字符串
Number()函數(shù)裝換規(guī)則:

  • truefalse對應(yīng)1和0
  • 數(shù)字輸出數(shù)字
  • null0
  • undefined返回NaN
  • 字符串
    只包含數(shù)字轉(zhuǎn)換為十進(jìn)制
'1';//1
'123';//123
'011';//前綴0被忽略,11,就8進(jìn)制不行
'1.1'//1.1
'0xf';//16進(jìn)制形式,為10進(jìn)制15
'';//空字符串為0

除了以上格式,皆為NaN

  • 對對象使用Number()函數(shù)
    調(diào)用對象的valueOf()方法,依照前述規(guī)則進(jìn)行轉(zhuǎn)換返回的值,如果轉(zhuǎn)換結(jié)果為NaN,則調(diào)用對象toString(),然后依照字符串轉(zhuǎn)換規(guī)則轉(zhuǎn)換

Number()函數(shù)過于復(fù)雜,一般使用parseInt()函數(shù)
規(guī)則:
忽略字符串前面的空格,直到第一個(gè)非空字符,如果這個(gè)非空字符不是數(shù)字或者正負(fù)號,返回NaN,所以parseInt()轉(zhuǎn)換空字符串返回NaN,如果第一個(gè)非空字符是正負(fù)號或者數(shù)字,繼續(xù)解析以后字符,直到遇見非數(shù)字字符,1234blue1234,22.522,因?yàn)樾?shù)點(diǎn)不是數(shù)字字符
如果字符串中的第一個(gè)非空字符是數(shù)字字符或者正負(fù)號,parseInt()也可以識(shí)別出各種進(jìn)制

' 1234ddd';//1234
'';//NaN
'0xA';//10
'010';//8
'22.5';//22

注意,在ES5中,parseInt()不能解析8進(jìn)制(為毛老是8進(jìn)制),有前綴0的會(huì)被解析成10進(jìn)制
parseInt()的第二個(gè)參數(shù)可以指定解析的進(jìn)制,如parseInt("0xAF",16),解析為175
一般我們都指定進(jìn)制
parsefloat()parseInt()基本類似,不同在于

parsefloat('2.1.1');//為2.1
parseInt('2.1.1');//為2

parsefloat()會(huì)忽略前綴0,可以轉(zhuǎn)成整數(shù)就返回整數(shù),如'1.0',16進(jìn)制格式始終返回0,parsefloat()只解析10進(jìn)制

'1234kkk';//1234
'0xA';//0
'22.6';//22.6
'22.2.2';//22.2
'0099.09';//99.09
'3.125e7';//31250000

string類型

由0到多位Unicode字符組成的字符序列,即字符串。由""或者''包裹,兩者意義相同,配對即可。

字符字面量

特殊字面量,轉(zhuǎn)義序列,用于表示非打印字符或者有特殊用途的字符

\n;//換行
\t;//制表
\b;//空格
\r;//回車
\xnn;nn為16進(jìn)制,\x41表示A
\unnnn;nnnn為16進(jìn)制,表示一個(gè)Unicode字符,\u03a3

后兩種表示法也可以放在字符串中

var text = 'this is a pen apple pen \u03a3';

length可以獲得字符串中16位字符(哪個(gè)大神解釋下?16位不就是雙字節(jié)嗎)的數(shù)目,如果字符串中包含雙字節(jié)字符,不精確,一個(gè)漢字占用兩個(gè)長度,但是兩字漢字一起卻占用三個(gè)長度。

字符串特點(diǎn)

字符串不可變,只能用新的字符串覆蓋原來的變量名

var str = "Hello";
str = str + " World"http://Hello World
轉(zhuǎn)換成字符串

幾乎每個(gè)值都有toString()方法,nullundefined沒有

var a = true;
a.toString();//‘true’
var b = 11;
b.toString();//'11'

數(shù)值型調(diào)用toString()方法時(shí),可以指定進(jìn)制

var num = 10;
num.toString();//10
num.toString(2);//1010
num.toString(8);//12

因?yàn)?code>null和undefined沒有toString()方法,不小心調(diào)用會(huì)報(bào)錯(cuò),我們可以使用String()函數(shù),任意數(shù)值都可以轉(zhuǎn)換,轉(zhuǎn)換規(guī)則如下:

  • 值有toString方法,調(diào)用返回
  • 值是null返回'null'
  • 值是undefined返回'undefined'
    使用加號+操作符,和字符串一起,值就會(huì)調(diào)用String()

object類型

一組數(shù)據(jù)和功能的集合,通過new創(chuàng)建

var o = new Object();//沒有參數(shù)時(shí),可以省略(),不推薦

Object類型是所有實(shí)例的基礎(chǔ)
每個(gè)Object類型都有:

  • Constructor:保存著用于創(chuàng)建當(dāng)前對象的函數(shù),比如Object()
  • hasOwnProperty(propertyName)propertyName必須為字符串,檢查在當(dāng)前實(shí)例中是否存在相應(yīng)的屬性名
  • isPrototypeOf(object):檢查傳入的對象是否是另一個(gè)對象的原型(到底誰是誰的原型)
  • propertyIsEnumerable(propertyName):屬性是否可遍歷
  • toLocaleString():返回與執(zhí)行環(huán)境地區(qū)對應(yīng)的字符串
  • toString():字符串表示
  • valueOf():返回對象的字符串,數(shù)值或者布爾值表示,對象->值

注意:瀏覽器環(huán)境中的對象,比如BOM或者DOM中的對象,屬于宿主對象,不一定會(huì)繼承Object

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容