JavaScript 的数据类型 相关知识点

(1)基本数据类型介绍

JavaScript的数据类型分为两类:原始类型(primitive type)和对象类型(object type)

          或者说是:可以拥有方法的类型和不能拥有方法的类型

          或者说是:可变(mutable)类型和不可变(immutable)类型

原始类型主要包括:数字(number)、字符串(string)、布尔值(boolean)、undefined (一般来说 未定义的值和定义未赋值的为undefined

        其中NaN属于一种特殊的number

对象类型说白了数据类型就是:对象(object)

        其中 null 属于一种特殊的object

        对象(object)是属性(property)的集合,基本上每个属性都由 key/value 构成

        其中,类可以看做是对象类型的子类型,主要有:数组(Array)、函数(Function)、日期(Date)、正则(RegExp)、错误(Error)类

看代码:

 
var a1; 
var a2 = true; 
var a3 = 1; 
var a4 = "Hello"; 
var a5 = new Object(); 
var a6 = null; 
var a7 = NaN; 
var a8 = undefined; 
alert(typeof a); //显示"undefined" 
alert(typeof a1); //显示"undefined" 
alert(typeof a2); //显示"boolean" 
alert(typeof a3); //显示"number" 
alert(typeof a4); //显示"string" 
alert(typeof a5); //显示"object" 
alert(typeof a6); //显示"object" 
alert(typeof a7); //显示"number" 
alert(typeof a8); //显示"undefined" 

通过简单的比较可以发现,null和undefined值相等,但不全等;

NaN与任何值都不相等,包括自己。如果要判断变量x是否是NaN,通过方法x==NaN 行不通,应该使用x!=x 判断,当然了,也可以使用函数isNaN(x)判断

函数isNaN() 如果参数是NaN或者是一个非数字值(比如字符串或对象),则返回true

另外Infinity表示无穷大,有相应函数判断 isFinite(),参数如果不是NaN、Infinity、或-Infinity的时候返回true

负零值是特殊的,和正零值是相等的,但作为除数时就不一样了:

var zero = 0; //正
var negz = -0; //负
console.log(zero === negz); //true
console.log(1/zero === 1/negz); //false

另外,JavaScript是属于使用二进制浮点数的编程语言,所以计算浮点数的时候可能会出现问题,应该避免:比如

var z = .4 - .3;
console.log(z);   // 0.10000000000000003
var x = .3 - .2;
console.log(x);   // 0.09999999999999998
var y = .2 - .1;
console.log(y);   // 0.1

简单比较

 
var a1; //a1的值为undefined 
var a2 = null; 
var a3 = NaN; 
alert(a1 == a2); //显示"true" 
alert(a1 != a2); //显示"false"
alert(a1 === a2); //显示"false" 
alert(a1 == a3); //显示"false" 
alert(a1 != a3); //显示"true" 
alert(a2 == a3); //显示"false" 
alert(a2 != a3); //显示"true" 
alert(a3 == a3); //显示"false" 
alert(a3 != a3); //显示"true" 

可以拥有方法:就是说可以拥有方法的类型,比如一个数组具有排序的方法:arr.sort()

      一般来说,对象、数字、字符串、布尔值都可以拥有方法

不能拥有方法:null  undefined之类

可变类型:就是说值是可以修改的,比如一个数组,或者说一个对象,JavaScript程序可以更改对象属性值和数组元素的值。

var o = { x: 1};
o.x = 2;  //change
o.y = 3;  //add

不可变类型:数字、字符串、布尔值、null、undefined 之类就属于不可变的

比如说字符串是不可变类型:(一般来说是返回一个新值,而原来的值不变)

var str = "you";
console.log(str.toUpperCase()); //YOU
console.log(str); //you

而JavaScript变量是属于无类型(untyped),就是说变量可以赋予不同类型的值。

全局属性有哪些?比如undefined、Infinity、NaN

全局函数有哪些?比如isNaN()、parseInt()、eval()

全局对象有哪些?比如Math、JSON

构造函数有哪些?比如Date()、RegExp()、String()、Object()、Array()

(2)null和undefined的区别

console.log(Number(null)); // null转换为0
console.log(5+null);       // 5
console.log(Number(undefined));  //undefined转换为NaN
console.log(5+undefined);        //NaN
console.log(null == undefined);  //true
console.log(null === undefined); //false

null 表示 没有对象,此处不应有值   典型的用法有:   1.作为函数的参数,表示该函数的参数不是对象

  2.作为对象原型链的终点

比如:

Object.getPrototypeOf(Object.prototype); //null

undefined表示 缺少值,本处应该有一个值,但是还没有定义  典型的用法有:   1.变量被声明了,但还没有赋值时,就等于undefined

  2.调用函数时,应该提供的参数没有提供,该参数就等于undefined

  3.对象没有赋值的属性,该属性的值就为undefined

  4.函数没有返回值时,默认返回undefined

比如:

var i;
i // undefined

function f(x){console.log(x)}
f() // undefined

var  o = new Object();
o.p // undefined

var x = f();
x // undefined

(3)数据类型转换

JavaScript取值类型非常灵活,类型的转换也非常灵活,要掌握好,也不是说很容易的

(此部分摘自:http://www.cnblogs.com/2050/archive/2012/08/17/2644189.html )

1)转换成布尔值

程序在 if 语句 以及 ||、&&、! 等逻辑判断的环境下会把表达式自动转换成布尔值。  

想要手动转换某个东西为布尔值有两种方法:

  (1)、使用 !! ;  比如 console.log(!!30); //true

    (2)、使用 Boolean(),记住前面不要加new; 比如console.log(Boolean(30)); //true

1、数字转换成布尔值

除了0和NaN 被转换成false外,所有自他数字都会被转换成true

2、字符串转换成布尔值

这个更简单,除了空字符串被转换成false外,所有字符串都会被转换成true

3、其他类型转换成布尔值

undefined和null会被转换成false, 任何对象(包括数组)和函数都会被转换成true,记住,是任何

var o = new Boolean(false);
alert(o);//转换成字符串,结果是false
alert(!!o); //转换成布尔值,结果是 true

2)转换成字符串

把某一个东西强制转换成字符串有两种方法:

'' + x //方法一,用一个空字符串与之相加
String(x) //方法二,使用不带new的字符串构造函数

1、数字转换成字符串

这个没什么要说的,数字都是按原样转换成字符串,但用科学计数法表示的数字(也就是带e的)会转换成它内部代表的真实的数字的字符串。

还需要注意的是,当使用二元的加号运算符时,如果两个运算数中有一个不是数字,则会进行字符串的连接操作,而不是数学加法操作,两个运算数都会被转换成字符串。当null与数字相加时,不会进行字符串连接,而是会把null转换成0来进行数学元素。

[]+1+3  //结果为13
[1]+3   //结果为13
null+1+3  //结果为4

2、其他类型转换成字符串

当对象或函数转换成字符串时,会调用它们的 toString() 方法来进行转换,默认的是 Object.prototype.toString 和 Function.prototype.toString,但它们是可以被我们自定义的toString方法覆盖的。当把一个函数转换成一个字符串时,不 一定就要显示函数的源代码,Function.prototype.toString 方法的结果依赖于它的环境是怎么实现它的。

3)转换成数字

除了加号以外的其他数学运算符,都会进行转换为数字的操作。把一个东西强制转换成数字也有两种方法:

+x //使用一个一元的加号运算符,这是最快的方法
x-0 或 x*1 //另一种形式
Number(x)  //使用不带new的数字构造函数进行转换

1、字符串转换成数字

除了空字符串会被转换成0以外,如果字符串中是正确的数字书写形式,那么都可以顺利转换成相应的数字,不管是小数、科学计数还是八进制、十六进制形式等。但是如果参杂了其他不能构成数字或不符合数字书写规则的东西,则会被转换成NaN。

NaN是指不是数字的意思,任何数字数字跟NaN进行运算得到的结果都是NaN,NaN甚至跟自己也不相等。

2、其它类型转换成数字

对象和函数总是被转换成NaN, undefined也会被转换成NaN, 但null会被转换成0

上面的表遗漏了数组的情况。数组会首先被转换成字符串,然后再转换成数字。

alert(+[]);  //结果为0
alert(+[1]); //结果为1
alert(+[1,2]); //结果为NaN
alert(+new Array(1)); //结果为0
alert(+new Array(1,2)); //结果为NaN

3、数字转换函数

parseInt 比如

console.log(parseInt("123one")); //123
console.log(parseInt("one123")); //NaN

parseFloat

附表(权威指南)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java 源码分析

内部类的作用

一、 作用 内部类可以很好的实现隐藏,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以加上这几个修饰词。 内部类拥有外围...

2573
来自专栏武军超python专栏

2018-7月19日系统模块字符串操作

每天遇到的新单词: recursion   n:递归 objece      n:对象 maximum     adj:最大值 exceed      ...

1203
来自专栏Golang语言社区

厚土Go学习笔记 | 26. 函数闭包

如果非必要,尽量不要在程序中使用闭包。 go函数可以是一个闭包。闭包是一个函数值,它引用了函数体之外的变量。这个函数可以对这个变量进行访问和赋值。 展示一个例子...

35813
来自专栏LIN_ZONE

es6语法需要注意的部分

由于无符号右移运算的结果是一个 32 位的正数,所以负数的无符号右移运算得到的总是一个非常大的数字。例如,如果把 -64 右移 5 位,将得到 13421772...

864
来自专栏Python研发

最全Python内置函数

判断真假,  True:真  ,  False:假,   把一个对象转换成bool值

2092
来自专栏小古哥的博客园

JavaScript 正则表达式入门教程

正则表达式是描述一组字符串特征的模式,用来匹配特定的字符串 主要分三个部分:基本语法、RegExp对象的方法、JS中支持正则表达式的String对象方法 一、基...

3383
来自专栏编程

Python面向对象1:基础介绍+封装特征

目前有三种编程方式: 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封...

2087
来自专栏九彩拼盘的叨叨叨

JavaScript 正则表达式介绍

正则表达式就是一个用来描述字符模式的对象。它被用来在文本中执行模式匹配(pattern-matching)以及”查找-替换”(search-and-replac...

813
来自专栏抠抠空间

函数 (一) 基础

一、函数的作用 函数可以让我们代码结构更清晰,而且避免了代码的重复,冗余,使一段代码或者功能可以反复的被调用,大大提高了开发效率 二、函数的定义 def 函数名...

2956
来自专栏开源优测

[快学Python3]Tuple(元组)

概述 元组,使用小括号()来标识,其特点是:元组中的元素不可修改 下面我们看下如何创建元组的示例: tuple1 = (u'DeepTest', u'开源优测'...

2665

扫码关注云+社区

领取腾讯云代金券