Javascript中的数据类型之旅
虽然javascript是弱类型语言,但是,它也有自己的几种数据类型,分别是:number、string、boolean、object、udefined、null。其中,object属于复杂数据类型,object 由无序的键值对组成。其余几种都属于简单数据类型。注意:变量类型首字母大写,而变量值首字母是小写的。
javascript不支持自定义类型,所以javascript中的所有值都属于这六种类型之一。
根据ecmascript 5.1的规范,javascript*有六种数据类型,分别为:undefined, null, boolean,number, string、object。前五种属于基本类型,最后一种属于object类型。
最新的ecmascript 6 又加了一种类型:symbol (ecmascript 6 新定义)
基本数据类型
undefined:只有一个值,为undefined,意味着“空值(no value)”,适用于所有数据类型。
null:只有一个值,为null,意味着“空对象(no object)”,只适用于对象类型。(literal)
boolean:有两个值,为true与false
number:的值是遵循ieee 754标准的64位浮点数的集合,没有整型数据结构。此外还包含三个特殊的值:nan、infinity、-infinity
string:值是有穷个unicode字符的集合。必须用'或"括起来。
一、string
javascript的字符串类型用于表示文本数据。它是一组16位的无符号整数值的“元素”。在字符串中的每个元素占据了字符串的位置。第一个元素的索引为0,下一个是索引1,依此类推。字符串的长度是它的元素的数量
与 c 语言不同,javascript 中字符串是不可变的(译注:如,javascript 中对字符串的操作一定返回了一个新字符串,原始字符串并没有被改变)
javascript中一切都是object-based
创建string,也有两种类型
1、使用字面量方式创建的字符串,为基本类型的string //string
2、使用string()创建的字符串,为基本类型的string // string
3、使用构造函数 new string()的方式创建的字符串,为对象类型的 //string
var str1 = "javascript"; //string
var str2 = string("javascript"); //string 不推荐
var str3 = new string('javascript'); //object
object 和 string也是有区别的
s1 = "2 + 2"; // creates a string primitive
s2 = new string("2 + 2"); // creates a string object
console.log(eval(s1)); // returns the number 4
console.log(eval(s2)); // returns the string "2 + 2"
字符串对象的转换 valueof -》 string
console.log(eval(s2.valueof())); // returns the number 4
二、boolean
不要将原始值true false,和值为true false的boolean对象相混淆
1、如果boolean构造函数的参数不是一个布尔值,则该参数会被转换成一个布尔值
2、如果参数是 0, -0, null,false, nan, undefined, 或者空字符串 (""),生成的boolean对象的值为false. 其他任何值,包括任何对象或者字符串"false", 都会创建一个值为true的boolean对象
var x = new boolean(false); if(x){ console.log(x.valueof(),typeof x); // false object }
上面会执行,很神奇的代码
不要通过新建boolean对象的方法来将一个非布尔值转化成布尔值. 直接使用boolean函数才是正确的
var x = boolean(expression); // 这样用 var x = new boolean(expression); // 而不要这样! 初始化的时候 //false var bnoparam = new boolean(); var bzero = new boolean(0); var bnull = new boolean(null); var bemptystring = new boolean(""); var bfalse = new boolean(false); //true var btrue = new boolean(true); var btruestring = new boolean("true"); var bfalsestring = new boolean("false"); var bsulin = new boolean("su lin");
三、number
根据 ecmascript 标准,javascript 中只有一种数字类型:基于 ieee 754 标准的双精度 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); // true number.isnan(number.nan); // true number.isnan(0 / 0) // true // e.g. these would have been true with global isnan() number.isnan("nan"); // false number.isnan(undefined); // false number.isnan({}); // false number.isnan("blabla"); // false // these all return false number.isnan(true); number.isnan(null); 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__ === null);//true
console.log(typeof number);//function
使用 number 转换 date 对象
var d = new date("december 17, 1995 03:24:00");
console.log(number(d));
四、null
null 是一个 javascript 字面量,表示空值(null or an "empty" value),即没有对象被呈现(no object value is present)。它是 javascript 原始值 之一。
null 是一个字面量 (而不是全局对象的一个属性,undefined 是 )
console.log(null); //null
console.log(undefined);//undefined
console.log(window.null);//undefined
console.log(window.undefined);//undefined
null与undefined的区别
console.log(foot);//uncaught referenceerror: foot is not defined var foo; console.log(foo);//undefined var bar =null; console.log(bar);//null typeof null // object (bug in ecmascript, should be null) typeof undefined // undefined null === undefined // false null == undefined // true
所以判断null,可以判断类型 + 值
五、undefined
在javascript中,undefined这个词有多重含义.首字母大写的undefined表示的是一种数据类型,小写的undefined表示的是属于这种数据类型的唯一的一个值.但这两种undefined都只能存在于文档或规范中,不能存在于javascript代码中.在javascript代码中,你看到的undefined最有可能是全局对象的一个属性,该属性的初始值是就是前面所说的原始值undefined,还有种情况就是,这个undefined是个局部变量,就像其他普通变量一样,没有任何特殊性,它的值不一定是undefined,但通常情况下都是的.下面我们所说的undefined,都指的是window.undefined这个属性.
在es3中(firefox4之前),window.undefined就是一个普通的属性,你完全可以把它的值改变成为任意的真值,但在es5中((firefox4之后),window.undefined成了一个不可写,不可配置的数据属性,它的值永远是undefined.
一个未初始化的变量的值为undefined,一个没有传入实参的形参变量的值为undefined,如果一个函数什么都不返回,则该函数默认返回undefined.
你可以使用严格相等运算符来判断一个值是否是undefined:
var foo; console.log(foo === undefined);//true console.log(typeof foo === 'undefined');//true console.log(window.foo === undefined);//true console.log(bar === undefined);//uncaught referenceerror: bar is not defined console.log(typeof bar === 'undefined');//true console.log(window.bar === undefined);//true console.log(typeof undefined == 'undefined'); //true console.log(typeof null == 'object');//true console.log(null == undefined);//true console.log(null === undefined);//false
总结
null的值是null,表示一个空对象指针,没有指向任何对象
undefined的值是undefined,表示申明变量或对象的属性却未初始化
undefined值是派生自null的,所以对他们执行相等测试会返回true
数值、布尔值、对象和字符串值都有tostring()方法。但null和undefined值没有这个方法
多数情况下,调用tostring()方法不必传递参数。但是,在调用数值的tostring()方法时,可以传递一个参数:输出数值的基数
var num = 10;
alert(num.tostring()); //"10"
alert(num.tostring(2)); //"1010"
alert(num.tostring(8)); //"12"
alert(num.tostring(10)); //"10"
alert(num.tostring(16)); //"a"
在不知道要转换的值是不是null或undefined的情况下,还可以使用转型函数string(),这个函数能够将任何类型的值转换为字符串。string()函数遵循下列转换规则:
● 如果值有tostring()方法,则调用该方法(没有参数)并返回相应的结果
● 如果值是null,则返回"null"
● 如果值是undefined,则返回"undefined"
六、object
javascript中一切皆object
// objects typeof {a:1} === 'object'; // 使用array.isarray或者object.prototype.tostring.call方法可以从基本的对象中区分出数组类型 typeof [1, 2, 4] === 'object'; typeof new date() === 'object'; // 下面的容易令人迷惑,不要这样使用! typeof new boolean(true) === 'object'; typeof new number(1) ==== 'object'; typeof new string("abc") === 'object'; // 函数 typeof function(){} === 'function'; typeof math.sin === 'function';
实例化一个空object
var o = new object();
var o = new object(undefined);
var o = new object(null);
var o = {};
原型
定义属性为__proto__: 值 或 "__proto__": 值 时,不会创建名为__proto__属性。如果给出的值是对象或者null,那么对象的[[prototype]]会被设置为给出的值。(如果给出的值不是对象也不是null,那么对象的原型不会改变。)
var obj1 = {}; assert(object.getprototypeof(obj1) === object.prototype); var obj2 = { __proto__: null }; assert(object.getprototypeof(obj2) === null); var protoobj = {}; var obj3 = { "__proto__": protoobj }; assert(object.getprototypeof(obj3) === protoobj); var obj4 = { __proto__: "not an object or null" }; assert(object.getprototypeof(obj4) === object.prototype); assert(!obj4.hasownproperty("__proto__"));
在对象字面值中,仅有一次变更原型的机会;多次变更原型,会被视为语法错误。
不使用冒号记法的属性定义,不会变更对象的原型;而是和其他具有不同名字的属性一样是普通属性定义。
var __proto__ = "variable"; var obj1 = { __proto__ }; assert(object.getprototypeof(obj1) === object.prototype); assert(obj1.hasownproperty("__proto__")); assert(obj1.__proto__ === "variable"); var obj2 = { __proto__() { return "hello"; } }; assert(obj2.__proto__() === "hello"); var obj3 = { ["__prot" + "o__"]: 17 }; assert(obj3.__proto__ === 17);
与json的区别
json 只允许"property": value syntax形式的属性定义。属性名必须用双引号括起来。且属性定义不允许使用简便写法。
json中,属性的值仅允许字符串,数字,数组,true,false,或者其他json对象。
json中,不允许将值设置为函数。
date 等对象,经json.parse()处理后,会变成字符串。
json.parse() 不会处理计算的属性名,会当做错误抛出。
defineproperty
object.defineproperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象 // 使用 __proto__ object.defineproperty(obj, "key", { __proto__: null, // 没有继承的属性 value: "static" // 没有 enumerable // 没有 configurable // 没有 writable // 作为默认值 }); // 显式 object.defineproperty(obj, "key", { enumerable: false, configurable: false, writable: false, value: "static" }); // 回收同一对象 function withvalue(value) { var d = withvalue.d || ( withvalue.d = { enumerable: false, writable: false, configurable: false, value: null } ); d.value = value; return d; } // ... 和 ... object.defineproperty(obj, "key", withvalue("static")); // 如果 freeze 可用, 防止代码添加 // value, get, set, enumerable, writable, configurable // 到对象原型上 (object.freeze||object)(object.prototype);
configurable当且仅当这个属性描述符值为 true 时,该属性可能会改变,也可能会被从相应的对象删除。默认为 false。
enumerabletrue 当且仅当该属性出现在相应的对象枚举属性中。默认为 false。
value 与属性相关的值。可以是任何有效的 javascript 值(数值,对象,函数等)。默认为 undefined。
writable true 当且仅当可能用 赋值运算符 改变与属性相关的值。默认为 false。
存取描述符同时具有以下可选键值:
get 一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。方法将返回用作属性的值。默认为 undefined。
set 一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。该方法将收到作为唯一参数的新值分配给属性。默认为 undefined。
ps:js中的变量定义
在javascript中,使用var来定义任何类型的变量,每一个变量只是用于保存数据的占位符。
var temp; //这句代码定义了一个变量,但其类型是未知的,可以存放任何类型的值,没有初始化的时候,test中存储是undefined。
var temp=2; //这句代码定义了一个变量,并直接初始化为数值型。
var temp="javascript"; // 这句代码定义了一个变量,并直接初始化微string型,单引号和双引号都可以,只要成对出现就行。
2、变量的作用域
在javascript中,使用var定义的变量,其作用域是在定义该变量的方法或函数内。也就是说,使用var定义的变量是局部变量。
例:
function test()
{
var temp="hello, javascript!";
}
test(); //方法调用的时候创建变量并初始化,执行结束后变量被销毁。
alert(temp); //undefined。因为变量temp已经被销毁,所以是未定义(undefined)。
如果在定义变量时,不使用var,那么定义的变量是全局变量。
例:
function test2() { temp2="hello, javascript!"; } test2(); //调用方法时,创建变量并初始化,执行结束后变量依然存在。 alert(temp2); //hello, javascript! 变量值依然存在
以上内容是小编给大家介绍的javascript中的数据类型之旅,希望大家喜欢。