本文我們主要和大家分享javascript的基本語法和資料類型,當然還是最基礎的不過多贅述,希望剛入門的同學還是看一下為好,不是看到這個標題覺得不就是語法和資料類型麼,就那麼點知識,早就會了。
ECMA-262 描述了一組具有特定用途的關鍵字。這些關鍵字可用來表示控制語句的開始或結束,或用於執行特定操作等。依照規則,關鍵字也是語言保留的,不能用來當識別符。以下就是ECMAScript的全部關鍵字(有*號上標的是第5 版新增的關鍵字):
break | #do | instanceof | #typeof |
---|---|---|---|
##case | else | new | var |
catch | #finally | return | void |
continue | for | # #switchwhile | |
function | this | with | |
ECMA-262 也描述了另外一組不能用來當作識別符的保留字。儘管保留字在這門語言中還沒有任何特定的用途。但它們有可能在將來被用作關鍵字。以下是ECMA-262 第3 版定義的全部保留字:
#abstract | ##enum | int | short |
---|---|---|---|
boolean | export | interface | static |
extends | #long | super | |
final | native | #synchronized | |
float | package | throws | |
goto | private | transient | |
#implements | protected | #volatile | |
---|---|---|---|
import | public |
在嚴格模式下,第5 版也對下列保留字施加了限制:
implements | package | public | #interface |
---|---|---|---|
private | static | #let | protected |
yield |
注意, let 和yield 是第5 版新增的保留字;其他保留字都是第3 版定義的。為了最大程度地確保相容性,建議大家將第3 版定義的保留字外加let 和yield 作為程式設計時的參考。
在實作ECMAScript 3 的JavaScript 引擎中使用關鍵字作標識符,會導致」Identifier Expected」錯誤。而使用保留字作標識符可能會也可能不會導致相同的錯誤,這取決於特定的引擎。
第5 版對使用關鍵字和保留字的規則進行了少許修改。關鍵字和保留字雖然仍然不能作為標識符使用,但現在可以用作物件的屬性名。一般來說,最好不要使用關鍵字和保留字作為識別碼和屬性名,以便與未來的ECMAScript 版本相容。
除了上面列出的保留字和關鍵字,ECMA-262 第5 版對eval 和arguments 也施加了限制。在嚴格模式下,這兩個名字也不能作為識別符或屬性名,否則會拋出錯誤。
ECMAscript有五種簡單資料型別(也叫基本的資料型別):Undefined .Boolean,String, Null,Number.還有一種複雜的資料型別(有時候也叫引用資料型別)–Object,Object本質上是一組無序的鍵值對組成的。 ECMAscript不支援任何建立自訂類型的機制,而所有的值都是上述的六種資料類型之一。
這個運算子(這裡說的不是函數,因為它不是一個函數)一般是在調試的時候使用,它的回傳值有六個:undefined(值為定義),boolean(布林值),string(字串),number(數字),object(這個值是物件或null),function(這個值是函數)。
對應於正規表示式而言,他其實也是物件(RegExp類型的物件)的另一種形式,但是對於Chrome7和safari5之前的版本傳回的是function其他的瀏覽器回傳的是object
下面我們來看一個簡單的例子
var msg; //如果没有赋值,默认是undefinedtypeof msg; //undefined// age 没有定义typeof age; //undefined
這個結果又邏輯上的合理性。因為雖然這兩個變數從技術角度來看是有本質的區別的,但是實際上那種變數都是不可能執行真正的操作的。
即使未初始化的變數會自動被賦值為undefined,但是顯示的初始化變數仍然是明智的選擇,如果能過做到這一點,那麼當typeof操作符返回的是undefined的時候,我們就能確定這個變數還沒有被宣告
console.log(undefined == null) // trueconsole.log(undefined === null) // false
實際上undefined值是由null衍生出來的,這是因為在ECMA-262中規定他們的相等性要回傳true。
儘管null和undefined有這樣的關係,但是他們的用途是完全不同的,在任何情況下都沒有必要把一個變數的值設定為undefined但是同樣夫人規則對應於null就是不合適的。以為只要意在保存物件變數還沒有保存真正的變數的時候,就應該要明確的讓變數保存null。這樣做不僅可以體現null作為空指標的慣例,而且能進一步的區分null和undefined
Number類型應該是ECMAscript中最令人關注的資料類型了,這種類型是使用的IEEE754來表示整數和浮點數值
var num1 = 070; //表示八进制数var num2 = 079 //无效的八进制数 表示79var num3 = 0x1f //十六进制数
八進位的字面量在嚴格模式下是無效的,會導致javascript引擎報錯
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>var f1 = 0.1; <br>var f2 = .1; //虽然是有效的0.1但是不推荐var f3 = 1.0; //会自动转换为1</span>
對於有些極大的或是極小的數值也可以用科學計數法表示,
var f4 = 3.125e7; //31250000
在这里还是要提示一下众所周知的浮点数不能比较相等法则,
在javascript中浮点数的最高精度是17位的小数,但在进行算术计算的时候精确度远远不如整数,例如0.1+0.2不等于0.3而是等于0.0000000000000004(4e-17)
这是使用基于IEEE754数据浮点计算的通病
由于内存的限制,ECMAscript并不能保存世界上所有的数,能保存的数能在浏览器中显示出来(通过Number.MAX_VALUE),最小值是(Number.MIN_VALUE)
当超出这个范围的时候,大于就变为Infinity,小于就变为-Infinity
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>var big = Number.MAX_VALUE + Number.MAX_VALUE;<br>console.log(big); //Infinity</span>
可以使用isFinite()函数判断这个值是否在最大值和最小值之间,如果在就返回true
通过访问Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY来得到-Infinity和Infinity
NaN,非数值类型(Not a Number)是一个特殊的值,这个数值表示一个应该返回数值的情况结果没有返回数值,在ECMAscript中,任何数值除以0并不会导致错误,会返回一个NaN,因此并不会影响代码的运行。
Nan本身有两个特点:任何设置NaN的操作都会返回NaN,这个特点在多步计算的时候可能导致错误,其次Nan和任何数值都不想等,包括本身:
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>console.log(NaN == Infinity)<br>console.log(NaN == 1)<br>console.log(NaN == NaN)<br>console.log(NaN == 1/0)//以上结果返回的都是false//下面是判断数据类型isNaN(NaN) //trueisNaN('123') //false,进行了数据类型的转换isNaN('f5') //trueisNaN(4) //false</span>
运用isNaN()函数可以判断这个变量是否是NaN类型的。
最神奇的是isNaN也是支持对象操作的,在基于对象调用isNaN函数时,会首先调用对象的valueOf方法,然后确定该方法返回的值是否可以转换为数值,如果不能就基于这个返回值再调用toString()方法,在测试返回值
对应于string类型,讨论的会比较少一点,string类型用于友零或者多个16位的Unicode字符组成的字符序列,即字符串。js中的单引号和双引号是没有区别的(想对于PHP来讲)。
转义的只是在这里就不多说了,
字面量在这里只说一点:
var text = "this is \u30a3"这个的长度是9因为\u30a3转义后表示一个字符
字符串在我们平常的开发当中我们是一直在用的,但是很少人知道其中的原理,下面我们就来讨论一下字符串的特点。
ECMAscript中的字符串是不可变的,也就是说,字符串一旦被创建,他们的值就不能被改变。要改变某个变量保存的字符串就先要销毁原来的字符串,然后用一个新的值来填充该变量,例如下面的代码:
var lang = 'java';
lang = lang + 'script';
以上的代码是变量lang中包含字符串‘java’。而第二行代码把lang的值重新定义为‘java’与’script’的结合,实际上这个操作过程如下:
1. 首先创建一个能容纳10个字符的新字符串
2. 然后将这个字符串中填充’java’和’script’
3. 最后一步是销毁原来的’java’字符串和’script’字符串,因为这两个字符串已经没用了
在这里主要注意的是null和undefined是没有toString()方法的,如果想要把他们转换为字符串可以使用转型函数String(),能把任何类型的值转换为字符串var val = null;String(val)
当使用数值转换为字符串的时候,可以在toString()传递一个参数,表示把数值变为多少进制的字符串:var num = 10;num.toString(2)返回的是1010;
ECMAscript中对象其实就是一组数据和功能的集合。
三种实例化一个对象的方法:
var o = new Ocject();var o = new Object;//不推荐使用var o = {};//当今最常用的
object中的对象和属性在后面我们在去讨论
这个我们在这里说的具体一点
1. 加法运算
console.log(1+2)
字符串的连接
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>var a ="121",<br> b =56,<br> c ="ss";<br>console.log(a+b);//12156console.log(a+c);//121ss</span>
数值和字符串之间的转换
<span style="font-family: 微软雅黑, "Microsoft YaHei";">//字符串转换我数值var a = "21212";<br/>+a //21212var b = "ss";<br/>+a //NaNvar c= "0xff";<br/>+a //255</span>
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>//数值转换为字符串var a =45;<br>+a; //"45"</span>
//布尔值的转换+true //1+fasle //0
减号的作用一般是都是用在正规的操作(也就是类型相同)的操作中,信息量虽然不是很大,但是还是有很多需要注意的地方,下面来举几个例子
var a = 5-true; //4 ,true被转换了var b = NaN -1;//NaNvar c= 5-2 //3var d = 5-"2";//3 “2”被转换为2var e = 5-null; //5 null被转换为了0
在我们编程的时候,当使用比较的时候我们希望,有的时候类型不同可以数值一样就可以就好像(2和"2")是可以相等的,但是有时候我们希望要求数值和类型都是一样的才返回真。这就很矛盾了,在ECMAscript中的解决方案是提供两组操作数:相等和全等
相等:先转换在比较
列出一下比较特殊的比较结果
表达式 | 值 |
---|---|
null == undefined | true |
“NaN” == NaN | false |
NaN == NaN | false |
NaN != NaN | true |
true == 2 | false |
undefined == 0 | false |
null == 0 | false |
全等:仅比较不转换
全等就比较严格了,在这里就不讨论什么了。
注意:null == undefined会返回true,但是null === undefined会返回false,这是由于他们的类型不一样
函数对于任何语言来说都是一个核心的概念。
在这里主要说一个问题,细节会在后面继续讨论
我们都是知道在函数中的arguments表示所有传进来的参数,比如说
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>function foo(a,b,c){<br> console.log(arguments[2] === c);//true}</span>
这个原因并不因为他们指向的是同一块内存,因为他们内存空间的值会相互同步,
arguments的值是不能被改写的如果改写的会操作
相关推荐:
以上是JavaScript初學者不知道的事(二)的詳細內容。更多資訊請關注PHP中文網其他相關文章!