J**ascript中的**类型之旅

时间:2016.04.19 发布人:ggdd159

J**ascript中的**类型之旅

已解决问题

谷歌ggdd159用户在2016.04.19提交了关于“保加利亚新冠J**ascript中的**类型之旅”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-02-26T16:11:23。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,真心佩服你,谢谢 !

希望以下的回答,能够帮助你。

第1个回答

用户名:xzc077  

虽然J**ascript是弱来自类型语言,但是,它也有自己的几种**类型,分别是:Number、String、Boolean、Object、Udefined、Null。其中,Object属于复杂**类型,Object由无序的键衷组成。其余几种都属于简单数散几功从牛委断务伯评染据类型。注意:变量类型首字免置母大写,而变量值首字母是小写的。

J**aScript不支持自定义类型,所以J**aScript中的所有旨属于这六种类型之一。
根据ECMAScript5.1的规范,j**ascript中**有六种**类型,分别为:Undefined,Null,Boolean,Number,String、Object。前五种属于基本类型,最后一种属于Ob问答ject类型。

最新的ECMAScript6又加了一种类型:Symbol(ECMAScript6新定义)

基本**类型

Undefine序担d:只有一个值,为undefined,意味着“空值(nova含据降有皇理lue)”,适用于所有**类型。
Null:只有一个值,为**ll,意味着“空对象(noobject)”,只适用于对象类型。(literal)
Bool周差响站章流想ean:有两个值,为true与false
Numbe胶充附这言现顶r:的值是遵循IEEE754标准的64位浮点数的集合,没有整型**结构。此外还包含三个特殊的值:NaN、I斗控古这nfinity、-Infinity
Strin较缩硫g:值是有穷个Unicode字符的集合。必须用'或"括起来。

一、String

J**aScript的字符串类型用于表示文本**。它是杂支掉妈滑块举一组16位的无符号整数值的“急几植灯纪引盟声改攻乡元素”。在字符串中的每个元素占据了字符串的位置。第一个元素的索引为0,下一个是索引1,依此类推。字符串的长度是它的元素的数量

与C语言不同,J**aScript中字符串是不可变的(译注:如,J**aScript中对字符串的操作一定返回了一个新字符串,原始字符串并没有被改变)

J**ascript中一切都是object-based

创建string,也有两种类型

1、使用字面量方式创建的字符串,为基本类本手优功似型的string//s急果美若告奏特积态tring

2、使用String()创建的字符串,为基本类型的stri获肥纸似武刘粉纸ng//string

其殖升结体3、使用构造函数newString()的方鲁式创建的字符串,为对象类型的//string

varstr1="j**ascript";//string
varstr2=St利策ring("j**ascript");//string不推荐
varstr3=newString('j**ascript');//object

object和string也是有区别的

s1="2+2";//createsastringprimitive
s2=newString("2+2");//creates农料除电易电aStringobject
console.log(eval(s1));/皮用亚右燃/returnsthe**mber4
console.log(eval(s2));//returnsthestring"2+2"
字符串对象的转换valueof-》string

console.log(eval(s2.valueOf()));//returnsthe**mber4

二、boolean

不要将原始值truefalse,和值为truefalse的Boolean对象相混淆

1、如果Boolean构造函数的参数不是一个布尔值,则该参数会被转换成一个布尔值

2、如果参数是0,-0,**ll,false,NaN,undefined,或者空字符串(""),生成的Boolean对象的值为false.其他任何值,包括任何对象或者字符串"false",都会创建一个值为true的Boolean对象

varx=newBoolean(false);if(x){console.log(x.valueOf(),typeofx);//falseobject}

上面会执行,很神奇的代码

不要通过新建Boolean对象的方法来将一个非布尔值转化成布尔值.直接使用Boolean函数才是正确的

varx=Boolean(expression);//这样用varx=newBoolean(expression);//而不要这样!初始化的时候//falsevarbNoParam=newBoolean();varbZero=newBoolean(0);varbNull=newBoolean(**ll);varbEmptyString=newBoolean("");varbfalse=newBoolean(false);//truevarbtrue=newBoolean(true);varbtrueString=newBoolean("true");varbfalseString=newBoolean("false");varbSuLin=newBoolean("SuLin");

三、Number

根据ECMAScript标准,J**aScript中只有一种数字类型:基于IEEE754标准的双精度64位二进制格式的值(-(253-1)到253-1)。它并没有为整数给出一种特定的类型。除了能够表示浮点数外,还有一些带符号的值:+Infinity,-Infinity和NaN(非数值,Not-a-Number)

数字类型只有一个整数,它有两种表示方法:0可表示为-0和+0("0"是+0的简写)。在实践中,这也几乎没有影响。例如+0===-0为真。但是,你可能要注意除以0的时候:

42/+0;//Infinity
42/-0;//-Infinity

如果参数无法被转换为数字,则返回NaN。

在饭造器上下文中(如:没有new操作符),Number能被用来执行类型转换

isNAN类型判断

Number.isNaN(NaN);//trueNumber.isNaN(Number.NaN);//trueNumber.isNaN(0/0)//true//e.g.thesewouldh**ebeentruewithglobalisNaN()Number.isNaN("NaN");//falseNumber.isNaN(undefined);//falseNumber.isNaN({});//falseNumber.isNaN("blabla");//false//TheseallreturnfalseNumber.isNaN(true);Number.isNaN(**ll);Number.isNaN(37);Number.isNaN("37");Number.isNaN("37.37");Number.isNaN("");Number.isNaN("");

原型链继承的关系

console.log(Number.prototype.__proto__==Object.prototype);//true
console.log(Number.prototype.__proto__.__proto__==Object.prototype.__proto__);//true
console.log(Object.prototype.__proto__===**ll);//true
console.log(typeofNumber);//function

使用Number转换Date对象

vard=newDate("December17,199503:24:00");
console.log(Number(d));

四、Null

**ll是一个J**aScript字面量,表示空值(**lloran"empty"value),即没有对象被呈现(noobjectvalueispresent)。它是J**aScript原始值之一。

**ll是一个字面量(而不是全局对象的一个属性,undefined是)

console.log(**ll);//**ll
console.log(undefined);//undefined
console.log(window.**ll);//undefined
console.log(window.undefined);//undefined

**ll与undefined的区别

console.log(foot);//UncaughtReferenceError:footisnotdefinedvarfoo;console.log(foo);//undefinedvarbar=**ll;console.log(bar);//**lltypeof**ll//object(buginECMAScript,shouldbe**ll)typeofundefined//undefined**ll===undefined//false**ll==undefined//true

所以判断**ll,可以判断类型+值

五、Undefined

在J**aScript中,undefined这个词有多重含义.首字母大写的Undefined表示的是一种**类型,小写的undefined表示的是属于这种**类型的唯一的一个值.但这两种undefined都只能存在于文档或规范中,不能存在于J**aScript代码中.在J**aScript代码中,你看到的undefined最有可能是全局对象的一个属性,该属性的初始值是就是前面所说的原始值undefined,还有种情况就是,这个undefined是个局部变量,就像其他普通变量一样,没有任何特殊性,它的值不一定是undefined,但通常情况下都是的.下面我们所说的undefined,都指的是window.undefined这个属性.

在ES3中(Firefox4之前),window.undefined就是一个普通的属性,你完全可以把它的值改变成为任意的真值,但在ES5中((Firefox4之后),window.undefined成了一个不可写,不可配置的**属性,它的值永远是undefined.

一个未初始化的变量的值为undefined,一个没有传入实参的形参变量的值为undefined,如果一个函数什么都不返回,则该函数默认返回undefined.

你可以使用严格相等运算符来判断一个值是否是undefined:

varfoo;console.log(foo===undefined);//trueconsole.log(typeoffoo==='undefined');//trueconsole.log(***.foo===undefined);//trueconsole.log(bar===undefined);//UncaughtReferenceError:barisnotdefinedconsole.log(typeofbar==='undefined');//trueconsole.log(***.bar===undefined);//trueconsole.log(typeofundefined=='undefined');//trueconsole.log(typeof**ll=='object');//trueconsole.log(**ll==undefined);//trueconsole.log(**ll===undefined);//false

总结

Null的值是**ll,表示一个空对象指针,没有指向任何对象
Undefined的值是undefined,表示申明变量或对象的属性却未初始化
undefined值是派生自**ll的,所以对他们执行相等测试会返回true
数值、布尔值、对象和字符串旨有toString()方法。但**ll和undefined值没有这个方法
多数情况下,调用toString()方法不必传递参数。但是,在调用数值的toString()方法时,可以传递一个参数:输出数值的基数

var**m=10;
alert(**m.toString());//"10"
alert(**m.toString(2));//"1010"
alert(**m.toString(8));//"12"
alert(**m.toString(10));//"10"
alert(**m.toString(16));//"a"

在不知道要转换的值是不是**ll或undefined的情况下,还可以使用转型函数String(),这个函数能够将任何类型的值转换为字符串。String()函数遵循下列转换规则:

  ●如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果

  ●如果值是**ll,则返回"**ll"

  ●如果值是undefined,则返回"undefined"

六、Object

J**ascript中一切皆Object

//Objectstypeof{a:1}==='object';//使用Array.isArray或者Object.***.call方法可以从基本的对象中区分出数组类型typeof[1,2,4]==='object';typeofnewDate()==='object';//下面的容易令人迷惑,不要这样使用!typeofnewBoolean(true)==='object';typeofnewNumber(1)===='object';typeofnewString("abc")==='object';//函数typeoffunction(){}==='function';typeofMath.sin==='function';

实例化一个空Object

varo=newObject();
varo=newObject(undefined);
varo=newObject(**ll);
varo={};

原型

定义属性为__proto__:值或"__proto__":值时,不会创建名为__proto__属性。如果给出的值是对象或者**ll,那么对象的[[Prototype]]会被设置为给出的值。(如果给出的值不是对象也不是**ll,那么对象的原型不会改变。)

varobj1={};assert(Object.getPrototypeOf(obj1)===Object.prototype);varobj2={__proto__:**ll};assert(Object.getPrototypeOf(obj2)===**ll);varprotoObj={};varobj3={"__proto__":protoObj};assert(Object.getPrototypeOf(obj3)===protoObj);varobj4={__proto__:"notanobjector**ll"};assert(Object.getPrototypeOf(obj4)===Object.prototype);assert(!obj4.hasOwnProperty("__proto__"));

在对象字面值中,仅有一次变更原型的机会;多次变更原型,会被视为语法错误。

不使用冒号记法的属性定义,不会变更对象的原型;而是和其他具有不同名字的属性一样是普通属性定义。

var__proto__="variable";varobj1={__proto__};assert(Object.getPrototypeOf(obj1)===Object.prototype);assert(obj1.hasOwnProperty("__proto__"));assert(obj1.__proto__==="variable");varobj2={__proto__(){return"hello";}};assert(obj2.__proto__()==="hello");varobj3={["__prot"+"o__"]:17};assert(obj3.__proto__===17);

与JSON的区别

JSON只允许"property":valuesyntax形式的属性定义。属性名必须用双引号括起来。且属性定义不允许使用简便写法。
JSON中,属性的值仅允许字符串,数字,数组,true,false,或者其他JSON对象。
JSON中,不允许将值设置为函数。
Date等对象,经JSON.parse()处理后,会变成字符串。
JSON.parse()不会处理计算的属性名,会当做错误抛出。

defineProperty

Object.defineProperty()方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性,并返回这个对象//使用__proto__Object.defineProperty(obj,"key",{__proto__:**ll,//没有继承的属性value:"static"//没有e**merable//没有configurable//没有writable//作为默认值});//显式Object.defineProperty(obj,"key",{e**merable:false,configurable:false,writable:false,value:"static"});//回收同一对象functionwithValue(value){vard=withValue.d||(withValue.d={e**merable:false,writable:false,configurable:false,value:**ll});d.value=value;returnd;}//和Object.defineProperty(obj,"key",withValue("static"));//如果freeze可用,防止代码添加//value,get,set,e**merable,writable,configurable//到对象原型上(Object.freeze||Object)(Object.prototype);

configurable当且仅当这个属性描述符值为true时,该属性可能会改变,也可能会被从相应的对象删除。默认为false。

e**merabletrue当且仅当该属性出现在相应的对象觅属性中。默认为false。

value与属性相关的值。可以是任何有效的J**aScript值(数值,对象,函数等)。默认为undefined。

writabletrue当且仅当可能用赋值运算符改变与属性相关的值。默认为false。

存取描述符同时具有以下可选键值:

get一个给属性提供getter的方法,如果没有getter则为undefined。方法将返回用作属性的值。默认为undefined。
set一个给属性提供setter的方法,如果没有setter则为undefined。该方法将收到作为唯一参数的新值分配给属性。默认为undefined。

ps:js中的变量定义

在J**aScript中,使用var来定义任何类型的变量,每一个变量只是用于保存**的占位符。

vartemp;//这句代码定义了一个变量,但其类型是未知的,可以存放任何类型的值,没有初始化的时候,test中存储是undefined。
vartemp=2;//这句代码定义了一个变量,并直接初始化为数值型。
vartemp="j**ascript";//这句代码定义了一个变量,并直接初始化微string型,单引号和双引号都可以,只要成对出现就行。

2、变量的作用域

在J**ascript中,使用var定义的变量,其作用域是在定义该变量的方法或函数内。也就是说,使用var定义的变量是局部变量。
例:

functiontest()
{
 vartemp="h**ello,J**ascript!";
}

test();//方法调用的时候创建变量并初始化,执行结束后变量被销毁。
alert(temp);//undefined。因为变量temp已经被销毁,所以是未定义(undefined)。

如果在定义变量时,不使用var,那么定义的变量是全局变量。

例:

functiontest2(){temp2="h**ello,J**ascript!";}test2();//调用方法时,创建变量并初始化,执行结束后变量依然存在。alert(temp2);//h**ello,J**ascript!变量值依然存在

以上内容是小编给大家介绍的J**ascript中的**类型之旅,希望大家喜欢。