数据类型 - Javascript语法基本 - Javascript中心

源代码: https://github.com/RobinQu/Programing-In-Javascript/blob/master/chapters/Javascript_Core/Javascript_Basics/Types.md

原文 http://pij.robinqu.me/Javascript_Core/Javascript_Basics/Types.html

本文存在讲明,但该网站的Markdown编辑器不支持,所以没法一般展现,请到原文参考。

Javascript数据范例

盘算机顺序的运转须要对值举行做作。在编程言语中,能够示意并操纵的值的范例称做数据范例。

JavaScript的数据范例分为两类: 原始范例和对象范例。JavaScript中的原始范例包括数字,字符串和布尔值。

1
"hello world"
true

JavaScript中有两个特别的原始值: null和undefined。

null
undefined

JavaScript除了上述的就是对象了,对象是属性的鸠合,每一个属性都由 键值对构成。

var i = {x: 1, y: 2}

一般对象是无序,JavaScript定义了一种特别对象数组,他是有序的鸠合。

var a[10];

JavaScript还定义了另一种特别的对象-函数。函数是具有与它相干联的可实行代码的对象。经由过程挪用函数来运转实行的代码,并返回效果。

function a(){
  console.log("hello world");
}

数字

  • 不辨别整数值和浮点数, JavaScript中一切数字均用64位浮点数值标识(IEEE 754)。
  • 就像java顺序员所熟习的double范例
  • 取值范围在 ±1.7976931348623157 × 10 308 到 ±5 × 10 −324 之间
  • 笔墨:

    • 整数
    • 十六进制 0x
    • 八进制 0
    • 浮点示意
    • Math类
    • 要领
      • pow // 求幂
      • round //四舍五入
      • ceil //向上取整
      • floor //向下取整
      • abs //求绝对值
      • max //最大值
      • min //最最小值
      • sqrt
      • log
      • exp
      • acos
      • asin
      • atan
      • atan2
      • random
      • sin
      • cos
    • 常量
      • PI
      • E
      • LN2
      • LN10
      • LOG2E
      • LOG10E
      • PI
      • SQRT1_2
      • SQRT2
    • 无限值
    • 正无限
      • Infinity //rw
      • Number.POSITIVE_INFINITY // r
      • 1/0
      • Number.MAX_VALUE + 1
    • 负无限
      • Number.NEGATIVE_INFINITY //rw
      • -Intifinty //r
      • -1/0
      • -Number.MAX_VALUE – 1
    • NaN
      • 不与任何值相称 包括它自己.
      • NaN //rw
      • Number.NaN //r
      • 0/0 //盘算效果为NaN
    • Zero
      • Number.MIN_VALUE/2
      • -Number.MIN_VALUE/2
      • -1/Infinity
      • -0
    • Rounding-error

        var x = .3 - .2 
        var y = .2 - .1
        x == y
        x == .1 // => false .3 -.2 不即是 ./
        y == .1 // => true .2 - .1 即是 .1
      

布尔值

布尔值指代真或假,这个范例只需两个值, 保留字true和false

一般比较语句的效果是布尔值 比方:

a==4

这段代码检测a是不是即是4

任何JavaScript的值都能够转换为布尔值。下面这些值会被转换为false

undefined
null
0
-0    
NaN
"" // the empty string

一切其他的值,包括一切对象都邑转换成true

null和undefined

null示意一个特别值,常用来形貌空值。 对null实行typerof,效果返回object, 也就是null被认为是一种特别的对象值,寄义黑白对象。

JavaScript运用undefined标识变量没有初始化。比方函数没有返回值,则返回undefined。undefined是预定义的全局变量(与null不一样,它不是关键字)。

日期与时刻

JavaScript言语中心包括Date()组织函数, 用来建立示意日期和时刻的对象。这些日期对象的要领为日期盘算经由过程了简朴的API:

var then = new Date(2011, 0, 1); // 2011年1月1日
var later = new Date(2011, 0, 1, 17, 10, 30) //同一天,当地时刻5:10:30pm,
var now = new Date(); //当前日期和时刻
var elapsed = now - then; //日期减法: 盘算时刻距离的毫秒数
later.getFullYear() // => 2011
later.getMonth() // => 0 从0最先计数的月份
later.getDate() // => 1 从1最先计数的天数
later.getDay() // => 5 获得礼拜几, 0代表礼拜日, 5代表礼拜一
later.getHours() // => 当地时刻17   5pm
later.getUTHours() // 运用UTC示意小时的时刻,基于时区

文本

字符串是一组由16位值构成的不可变的有序序列,每一个字符一般来自于Unicode字符集。

var i = "abcdefg";  

在JavaScript字符串中,反斜线\有着特别的用处,反斜线标记后加一个字符,就不再示意它们的字面寄义了,不如\n就是一个转义字符,它示意一个换行符。

'You\'re right, it can\'t be a quote'

JavaScript的内置功用之一就是字符串衔接:

msg = "Hello, " + "world";

字符串的length属性能够检察字符串的长度:

s.length

除了length属性, 字符串还供应很多能够挪用的要领:

var s = "hello, world" //定义一个字符串
s.charAt(0)      // => "h" 第一个字符
s.charAt(s.length-1) // => "d" 末了一个字符
s.substring(1, 4) // => "ell" 第2-4个字符
s.slice(1,4) // => "ell" 同上
s.slice(-3)  // => "rld": 末了三个字符
s.indexOf("l") // => 2 字符l初次涌现的位置
s.lastIndexOf("l") // => 10: 字符l末了一次涌现的位置
s.indexOf("l", 3) // => 在位置3及以后初次涌现字符l的位置
s.split(",") // => ["hello", "world"]分割成子串
s.replace("h", "H") // => "Hello, world": 全笔墨符替代
s.toUpperCase() // => "HELLO WORLD"

全局对象

全局对象在JavaScript中有着重要的用处: 全局对象的属性是全局定义的标记, JavaScript顺序能够直接运用,当诠释器启动时,它将建立一个新的全局对象,并给它一组定义的初始属性:

  • 全局属性,比方undefined, Infinity
  • 全局函数,比方parseInt()
  • 组织函数,比方Data(),
  • 全局对象,比方Math和JSON

包装对象

看如许一个例子:

var s = "hello world!";
var word = s.substring(s.indexOf(" ")+1, s.length);

字符串既然不是对象,为何它会有属性呢?只需援用了字符串s的属性,JavaScript就会将字符串值经由过程挪用new String(s)的体式格局转换成对象,
同字符串一样,数字和布尔值也有响应的要领。其他相似的包装类:

  • Number object
  • String object
  • Boolean Object
  • Function Object
  • RegExp Object
  • Error
    • SyntaxError
    • ReferenceError
    • TypeError

不可变的原始值和可变的原始对象援用

原始值是不可转变的,原始值的比较是值比较, 对象的比较并不是值比较:纵然两个对象包括一样的属性以及雷同的值,他们也不是相称的。我们一般将对象称为援用范例,对象的值都是援用,对象的比较也是援用的比较,当且仅当他们援用同一个基独享,他们才相称;

范例转换

当希冀运用一个布尔值的时刻,能够供应恣意范例值,JavaScript将根据须要自行转换范例。范例转换能够分为隐式转换和显式转换,所谓隐式转换即顺序在运转时举行的自动转换,显式转换则是工资的对范例举行强迫转换。

显式转换

经由过程手动举行范例转换,Javascript供应了以下转型函数:

  • 转换为数值范例:Number(mix)、parseInt(string,radix)、parseFloat(string)

  • 转换为字符串范例:toString(radix)、String(mix)

  • 转换为布尔范例:Boolean(mix)

Number(mix)函数,能够将恣意范例的参数mix转换为数值范例。其划定规矩为:

  • 假如是布尔值,true和false离别被转换为1和0

    Number(true); //=> 1 
    
  • 假如是数字值,返回自身。

    Number(5); //=> 5
    
  • 假如是null,返回0.

    Number(null); //=>0
    
  • 假如是undefined,返回NaN。

    Number(undefined); //=> NaN
    

假如是字符串,遵照以下划定规矩:

  • 假如字符串中只包括数字,则将其转换为十进制(疏忽前导0)

    Number("00001"); //=> 1
    
  • 假如字符串中包括有用的浮点花样,将其转换为浮点数值(疏忽前导0)

    Number("1.234"); //=> 1.234
    
  • 假如是空字符串,将其转换为0

    Number(""); //=> 0
    
  • 假如字符串中包括非以上花样,则将其转换为NaN

  • 假如是对象,则挪用对象的valueOf()要领,然后根据前面的划定规矩转换返回的值。假如转换的效果是NaN,则挪用对象的toString() 要领,再次遵照前面的划定规矩转换返回的字符串值。

下表列出了对象的valueOf()的返回值:

对象  返回值
Array   数组的元素被转换为字符串,这些字符串由逗号分开,衔接在一起。其操纵 与 Array.toString 和 Array.join 要领雷同。
Boolean Boolean 值。
Date    存储的时刻是从 1970 年 1 月 1 日半夜最先计的毫秒数 UTC。
Function    函数自身。
Number  数字值。
Object  对象自身。这是默许状况。
String  字符串值。

parseInt(string, radix)函数,将字符串转换为整数范例的数值。它也有肯定的划定规矩:

  • 疏忽字符串前面的空格,直至找到第一个非空字符
  • 假如第一个字符不是数字标记或许负号,返回NaN
  • 假如第一个字符是数字,则继承剖析直至字符串剖析终了或许碰到一个非数字标记为止
  • 假如上步剖析的效果以0开首,则将其看成八进制来剖析;假如以0x开首,则将其看成十六进制来剖析
  • 假如指定radix参数,则以radix为基数举行剖析

    parseInt("12", 10); // => 12
    parseInt("12", 16); // => 18
    parseInt("1E", 10); // => 1
    parseInt("E", 10); // => NaN
    

parseFloat(string)函数,将字符串转换为浮点数范例的数值。
它的划定规矩与parseInt基础雷同,但也有点区分:字符串中第一个小数点标记是有用的,别的parseFloat会疏忽一切前导0,假如字符串包 含一个可剖析为整数的数,则返回整数值而不是浮点数值。

parseFloat("1.222.2") // => 1.222
parseFloat("1.0") // => 1

toString(radix)要领。除undefined和null以外的一切范例的值都具有toString()要领,其 作用是返回对象的字符串示意。

对象  操纵
Array   将 Array 的元素转换为字符串。效果字符串由逗号分开,且衔接起来。
Boolean 假如 Boolean 值是 true,则返回 “true”。不然,返 回 “false”。
Date    返回日期的笔墨示意法。
Error   返回一个包括相干错误信息的字符串。
Function    返回以下花样的字符串,个中 functionname 是被调 用 toString 要领函数的称号: 
function functionname( ) { [native code] }
Number  返回数字的笔墨示意。
String  返回 String 对象的值。
默许  返回 “[object objectname]”,个中 objectname 是 对象范例的称号。

String(mix)函数,将任何范例的值转换为字符串,其划定规矩为:

  • 假如有toString()要领,则挪用该要领(不通报radix参数)并返回效果
  • 假如是null,返回”null”
  • 假如是undefined,返回”undefined”

Boolean(mix)函数,将任何范例的值转换为布尔值。
以下值会被转换为false:false、””、0、NaN、null、undefined,其他任何值都邑被转换为true。

隐式转换

考虑一下状况:

  • null == undefined
  • undefined == null
  • 2 == “2”
  • “2” == 2
  • NaN != NaN

在某些状况下,纵然我们不供应显现转换,Javascript也会举行自动范例转换,重要状况有:

用于检测是不是为非数值的函数:isNaN(mix)

isNaN()函数,经测试发明,该函数会尝试将参数值用Number()举行转换,假如效果为“非数值”则返回true,不然返回false。

递增递减操纵符(包括前置和后置)、一元正负标记操纵符

这些操纵符适用于任何数据范例的值,针对差别范例的值,该操纵符遵照以下划定规矩(经由对照发明,其划定规矩与Number()划定规矩基础雷同):

  • 假如是包括有用数字字符的字符串,先将其转换为数字值(转换划定规矩同Number()),在实行加减1的操纵,字符串变量变成数值变量。
  • 假如是不包括有用数字字符的字符串,将变量的值设置为NaN,字符串变量变成数值变量。
  • 假如是布尔值false,先将其转换为0再实行加减1的操纵,布尔值变量编程数值变量。
  • 假如是布尔值true,先将其转换为1再实行加减1的操纵,布尔值变量变成数值变量。
  • 假如是浮点数值,实行加减1的操纵。
  • 假如是对象,先挪用对象的valueOf()要领,然后对该返回值运用前面的划定规矩。假如效果是NaN,则挪用toString()要领后再运用前 面的划定规矩。对象变量变成数值变量。

加法运算操纵符

加号运算操纵符在Javascript也用于字符串衔接符,所以加号操纵符的划定规矩分两种状况:

假如两个操纵值都是数值,其划定规矩为:

  • 假如一个操纵数为NaN,则效果为NaN
  • 假如是Infinity+Infinity,效果是Infinity
  • 假如是-Infinity+(-Infinity),效果是-Infinity
  • 假如是Infinity+(-Infinity),效果是NaN
  • 假如是+0+(+0),效果为+0
  • 假如是(-0)+(-0),效果为-0
  • 假如是(+0)+(-0),效果为+0

假如有一个操纵值为字符串,则:

  • 假如两个操纵值都是字符串,则将它们拼接起来
  • 假如只需一个操纵值为字符串,则将别的操纵值转换为字符串,然后拼接起来
  • 假如一个操纵数是对象、数值或许布尔值,则挪用toString()要领获得字符串值,然后再运用前面的字符串划定规矩。关于undefined和 null,离别挪用String()显式转换为字符串。

能够看出,加法运算中,假如有一个操纵值为字符串范例,则将另一个操纵值转换为字符串,末了衔接起来。

乘除、减号运算符、取模运算符

这些操纵符针对的是运算,所以他们具有共同性:假如操纵值之一不是数值,则被隐式挪用Number()函数举行转换。细致每一种运算的细致划定规矩请参 考ECMAScript中的定义。

逻辑操纵符(!、&&、||)

逻辑非(!)操纵符起首经由过程Boolean()函数将它的操纵值转换为布尔值,然后求反。
逻辑与(&&)操纵符,假如一个操纵值不是布尔值时,遵照以下划定规矩举行转换:

  • 假如第一个操纵数经Boolean()转换后为true,则返回第二个操纵值,不然返回第一个值(不是Boolean()转换后的值)
  • 假如有一个操纵值为null,返回null
  • 假如有一个操纵值为NaN,返回NaN
  • 假如有一个操纵值为undefined,返回undefined

逻辑或(||)操纵符,假如一个操纵值不是布尔值,遵照以下划定规矩:

  • 假如第一个操纵值经Boolean()转换后为false,则返回第二个操纵值,不然返回第一个操纵值(不是Boolean()转换后的值)
  • 关于undefined、null和NaN的处置惩罚划定规矩与逻辑与(&&)雷同

关联操纵符(<, >, <=, >=)

与上述操纵符一样,关联操纵符的操纵值也能够是恣意范例的,所以运用非数值范例介入比较时也须要体系举行隐式范例转换:

  • 假如两个操纵值都是数值,则举行数值比较
  • 假如两个操纵值都是字符串,则比较字符串对应的字符编码值
  • 假如只需一个操纵值是数值,则将另一个操纵值转换为数值,举行数值比较
  • 假如一个操纵数是对象,则挪用valueOf()要领(假如对象没有valueOf()要领则挪用toString()要领),获得的效果根据前 面的划定规矩实行比较
  • 假如一个操纵值是布尔值,则将其转换为数值,再举行比较

注:NaN黑白常特别的值,它不和任何范例的值相称,包括它自己,同时它与任何范例的值比较大小时都返回false。

相称操纵符(==)

相称操纵符会对操纵值举行隐式转换后举行比较:

  • 假如一个操纵值为布尔值,则在比较之前先将其转换为数值
  • 假如一个操纵值为字符串,另一个操纵值为数值,则经由过程Number()函数将字符串转换为数值
  • 假如一个操纵值是对象,另一个不是,则挪用对象的valueOf()要领,获得的效果根据前面的划定规矩举行比较
    null与undefined是相称的
  • 假如一个操纵值为NaN,则相称比较返回false
  • 假如两个操纵值都是对象,则比较它们是不是是指向同一个对象

须要注重的是一个值转换为另一个值并不代表两个值相称。

References

    原文作者:RobinQu
    原文地址: https://segmentfault.com/a/1190000000515133
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞