深入理解JavaScript数据类型

javascript中的数据类型分为两类:原始类型和对象类型。其中原始类型包括Undefined、Null、Boolean、Number和String,除开这几种类型以外的就是对象类型。

null类型

null是javascript语言中的关键字,它表示一个特殊值,常用来表示“空值”,对null执行typeof操作符,结果返回字符串“object”,也就是说,可以将null认为是一个特殊的对象值,含义是“非对象”。但实际上,通常认为null是他自有类型的唯一成员,他可以表示数字,字符串和对象是“无值的”

  var car = null;
  console.log(typeof car); // "object"

undefined类型

undefined是JavaScript第二个表示空缺的值,用未定义的值表示 更深层次的“空值”,他是变量的一种取值,表明变量没有初始化,如果要查询的对象属性或数组元素的值返回undefined则说明这个属性或元素不存在,如果函数没有任何返回值,则返回undefined。使用typeof操作符返回undefined,表明这个值是这个类型的唯一成员。尽管null和undefined是不同的,但他们都表示值的空缺,两者往往可以互换,判断符“==”认为两者是相等的(需要使用“===”才能区分他们)。

var car
console.log(car);//"undefined"
console.log(typeof car);//"undefined"
function test() {
    return;
}
console.log(test())//"undefined"
console.log(undefined == null);//true
console.log(undefined === null);//false

boolean类型

布尔值代表真或假。这个类型只有两个值:true和false.虽然Boolean类型的字面值只有两个,但JavaScript中所有类型的值都有与这两个Boolean值等价的值。要将一个值转换为其对应的Boolean值,可以调用类型转换函数Boolean()。undefined,null,0,-0,NaN,‘‘会被转换成false,所有其他值都会转换成true.

var a = ‘‘;
var b = null;
var c = 0;
var d = NaN;
var e;
console.log(Boolean(a));//false
console.log(Boolean(b));//false
console.log(Boolean(c));//false
console.log(Boolean(d));//false
console.log(Boolean(e));//false

number类型

这种类型用来表示整数和浮点数值,还有一种特殊的数值,即NaN(非数值 Not a Number)。这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。例如,在其他编程语言中,任何数值除以0都会导致错误,从而停止代码执行。但在JavaScript中,任何数值除以0会返回NaN,因此不会影响其他代码的执行。NaN本身有两个非同寻常的特点。首先,任何涉及NaN的操作(例如NaN/10)都会返回NaN,这个特点在多步计算中有可能导致问题。其次,NaN与任何值都不相等,包括NaN本身。例如,下面的代码会返回false。

alert(NaN == NaN);    //false

JavaScript中有一个isNaN()函数,这个函数接受一个参数,该参数可以使任何类型,而函数会帮我们确定这个参数是否“不是数值”。isNaN()在接收一个值之后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,例如字符串”10“或Boolean值。而任何不能被转换为数值的值都会导致这个函数返回true。例如:

   alert(isNaN(NaN));    //true
    alert(isNaN(10));    //false(10是一个数值)
    alert(isNaN("10"));    //false(可能被转换为数值10)
    alert(isNaN("blue"));    //true(不能被转换为数值)
    alert(isNaN(true));    //false(可能被转换为数值1)

有3个函数可以把非数值转换为数值:Number()、parseInt()和parseFloat()。第一个函数,即转型函数Number()可以用于任何数据类型,而另外两个函数则专门用于把字符串转换成数值。这3个函数对于同样的输入会返回不同的结果。

Number()函数的转换规则如下:

  ● 如果是Boolean值,true和false将分别被替换为1和0

  ● 如果是数字值,只是简单的传入和返回

  ● 如果是null值,返回0

  ● 如果是undefined,返回NaN

  ● 如果是字符串,遵循下列规则:

   ○ 如果字符串中只包含数字,则将其转换为十进制数值,即”1“会变成1,”123“会变成123,而”011“会变成11(前导的0被忽略)

   ○ 如果字符串中包含有效的浮点格式,如”1.1“,则将其转换为对应的浮点数(同样,也会忽略前导0)

   ○ 如果字符串中包含有效的十六进制格式,例如”0xf“,则将其转换为相同大小的十进制整数值

   ○ 如果字符串是空的,则将其转换为0

   ○ 如果字符串中包含除了上述格式之外的字符,则将其转换为NaN

  ● 如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再依次按照前面的规则转换返回的字符串值。

  var num1 = Number("Hello World");    //NaN
    var num2 = Number("");                //0
    var num3 = Number("000011");        //11
    var num4 = Number(true);            //1

由于Number()函数在转换字符串时比较复杂而且不够合理,因此在处理整数的时候更常用的是parseInt()函数。parseInt()函数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直至找到第一个非空格字符。如果第一个字符串不是数字字符或者负号,parseInt()会返回NaN;也就是说,用parseInt()转换空字符串会返回NaN。如果第一个字符是数字字符,praseInt()会继续解析第二个字符,知道解析完所有后续字符或者遇到了一个非数字字符。例如,"1234blue"会被转换为1234,”22.5“会被转换为22,因为小数点并不是有效的数字字符。

  如果字符串中的第一个字符是数字字符,parseInt()也能够识别出各种整数格式(即十进制、八进制、十六进制)。为了更好的理解parseInt()函数的转换规则,下面给出一些例子

 var num1 = parseInt("1234blue");    //1234
 var num2 = parseInt("");            //NaN
 var num3 = parseInt("0xA");            //10(十六进制)
 var num4 = parseInt("22.5");        //22
 var num5 = parseInt("070");            //56(八进制)
 var num6 = parseInt("70");            //70

 var num7 = parseInt("10",2);        //2(按二进制解析)
 var num8 = parseInt("10",8);        //8(按八进制解析)
 var num9 = parseInt("10",10);        //10(按十进制解析)
 var num10 = parseInt("10",16);        //16(按十六进制解析)
 var num11 = parseInt("AF");            //56(八进制)
 var num12 = parseInt("AF",16);        //175

与parseInt()函数类似,parseFloat()也是从第一个字符(位置0)开始解析每个字符。而且也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。例如,”22.34.5“将会被转换成22.34。

parseFloat()和parseInt()的第二个区别在于它始终都会忽略前导的零。由于parseFloat()值解析十进制值,因此它没有用第二个参数指定基数的用法。

  var num1 = parseFloat("1234blue");    //1234
  var num2 = parseFloat("0xA");        //0
  var num3 = parseFloat("22.5");        //22.5
  var num4 = parseFloat("22.34.5");    //22.34
  var num5 = parseFloat("0908.5");    //908.5

string类型

String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由单引号(‘)或双引号(")表示。由单引号定界的字符串可以包含双引号,由双引号定界的字符串可以包含单引号。也可以将字符串拆分为多行,每行用反斜线结束。比如

var str1 = "";
var str2 = ‘test‘;
var str3 = ‘3.14‘;
var str4 = ‘wound you like "javascript"?‘
var str5 = ‘wound             you‘

javasript内置有字符串的连接,如果表达式中含有字符串,通过加号运算符可以将字符串拼接起来。对于不是字符串的值,会先转成字符串再拼接。

var str1 = ‘hello‘ + ‘ world‘;   //"hello world"
var str2 = ‘1‘ + 1;          //11
var str3 = true + ‘false‘;     //"truefalse"

字符串有许多可以调用的方法(可以通过String.prototype查看所有方法)。

var str = "hello world"
str.length      //11,字符串长度
str.charAt(0)    //‘h‘,第一个字符
str.charAt(str.length-1)    //‘d‘,最后一个字符
str.substring(1,4)        //‘ell‘,第2-4的字符
str.slice(1,4)            //‘ell‘,同上
s.indexOf(‘l‘)             //2,字符l首次出现的位置
str.split(‘ ‘)           //["hello","world"],分割字符串
str.__proto__           //字符串原型对象
String.prototype        //同上

object类型

除开以上类型以外的都是对象,包括数组,函数,对象,正则等等都是对象类型。对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。而创建Object类型的实例并为其添加属性和(或)方法,就可以创建自定义对象。也可以使用对象直接量进行创建,对象直接量是若干个键值对组成的映射表,也可以通过Object的create方法创建对象。对象都是独一无二的,不管通过什么方法创建的对象都不相等。

var obj1 = {};                    //空对象
var obj2 = new Object();        //空对象
var obj3 = Object.create(null); //空对象
var obj4 = new Object();
console.log(obj2 == obj4)         //false

每一个对象类型的实例都具有许多方法。可以通过Object.prototype来查看对象的所有方法。

var obj = new Object();
obj.toString()      //[object,object],转为字符串
obj.title = ‘hello‘    //添加属性
Object.defineProperty(obj,‘title‘,{
    value: ‘hello‘,
    writable: true,
    enumerable: true,
    configurable: true
})                    //同上
obj.valueOf()     //object, 返回对象的基元值。
obj.__proto__     //对象原型
Object.prototype  //同上
时间: 2024-11-03 05:35:20

深入理解JavaScript数据类型的相关文章

理解 JavaScript call()/apply()/bind()

理解 JavaScript this 文章中已经比较全面的分析了 this 在 JavaScript 中的指向问题,用一句话来总结就是:this 的指向一定是在执行时决定的,指向被调用函数的对象.当然,上篇文章也指出可以通过 call() / apply() / bind() 这些内置的函数方法来指定 this 的指向,以达到开发者的预期,而这篇文章将进一步来讨论这个问题. 先来回顾一下,举个简单的例子: var leo = { name: 'Leo', sayHi: function() {

JavaScript大杂烩6 - 理解JavaScript中的this

在JavaScript开发中,this是很常用的一个关键字,但同时也是一个很容易引入bug的一个关键字,在这里我们就专门总结一下页面中可能出现的this关键字(包括几种在其他页面文件中出现的this). JavaScript中的this关键字通常只使用在函数中,它指向当前函数的调用者,这是this关键字的本质,所有的使用方式都是围绕这个展开的,让我们来看一下在各种性质的函数中this的用法.1. 在对象的函数中使用this var person = { name: 'Frank', say: f

全面理解Javascript中Function对象的属性和方法

函数是 JavaScript 中的基本数据类型,在函数这个对象上定义了一些属性和方法,下面我们逐一来介绍这些属性和方法,这对于理解Javascript的继承机制具有一定的帮助. 属性(Properties) arguments 获取当前正在执行的 Function 对象的所有参数,是一个类似数组但不是数组的对象,说它类似数组是因为其具有数组一样的访问性质及方式,可以由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length.还有就是arguments对象存储的是实际传递给

JavaScript筑基篇(二)->JavaScript数据类型

说明 介绍JavaScript数据类型 目录 前言 参考来源 前置技术要求 JavaScript的6种数据类型 哪6种数据类型 undefined 类型 null 类型 boolean 类型 number 类型 string 类型 复杂 类型 基本型和引用型的不同 关于数据类型的一些常见疑问 为什么typeof null === 'object' string,String,object,Object,function,Function的关系 关于String类型与string类型的疑问 fun

数据的分类-JavaScript数据类型

JavaScript数据类型 1.数据类型是什么? 我们接触的绝大多数程序语言来说,把数据都进行了分类,包括数字.字符.逻辑真假:int,long,string,boolean....等等:我们都知道计算机对数据处理时是采用二进制的方式.将数据加载到内存中,并且通过CPU调度进行计算得到最终结果,那么,难道内存存储数据时会记录所以数据的类型吗?我认为答案是否定的,内存中的数据应该会根据所占内存的大小来进行区分和计算的,两种不同类型数据的计算,对于CPU来说只是调度了两个所占内存大小不一的数据来进

理解javascript

---出自 <node.js开发指南> 提起面向对象的程序设计语言,立刻让人想起的是C++.Java 等这类静态强类型语言,以及Python.Ruby 等脚本语言,它们共有的特点是基于类的面向对象.而说到JavaScript,很少能让人想到它面向对象的特性,甚至有人说它不是面向对象的语言,因为它没有类.没错,JavaScript 真的没有类,但JavaScript 是面向对象的语言.JavaScript 只有对象,对象就是对象,不是类的实例.因为绝大多数面向对象语言中的对象都是基于类的,所以经

深入理解JavaScript系列(17):面向对象编程之概论

介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题).我们将更多地从理论方面看这些问题. 特别是,我们会考虑对象的创建算法,对象(包括基本关系 - 继承)之间的关系是如何,也可以在讨论中使用(我希望将消除之前对于JavaScript中OOP的一些概念歧义). 英文原文:http://dmitrysoshnikov.com/ecmascript/chapter-7-1-oop-general-theory/ 概论.范式与思想 在进行E

深入理解JavaScript系列(19):求值策略(Evaluation strategy)

介绍 本章,我们将讲解在ECMAScript向函数function传递参数的策略. 计算机科学里对这种策略一般称为“evaluation strategy”(大叔注:有的人说翻译成求值策略,有的人翻译成赋值策略,通看下面的内容,我觉得称为赋值策略更为恰当,anyway,标题还是写成大家容易理解的求值策略吧),例如在编程语言为求值或者计算表达式设置规则.向函数传递参数的策略是一个特殊的case. http://dmitrysoshnikov.com/ecmascript/chapter-8-eva

深入理解JavaScript系列(24):JavaScript与DOM(下)

介绍 上一章我们介绍了JavaScript的基本内容和DOM对象的各个方面,包括如何访问node节点.本章我们将讲解如何通过DOM操作元素并且讨论浏览器事件模型. 本文参考:http://net.tutsplus.com/tutorials/javascript-ajax/javascript-and-the-dom-lesson-2/ 操作元素 上一章节我们提到了DOM节点集合或单个节点的访问步骤,每个DOM节点都包括一个属性集合,大多数的属性都提供为相应的功能提供了抽象.例如,如果有一个带有