之变量和数据类型科学技术

当程序要求将值保存起来以备现在采用时,便将其赋值给多个变量,值的档次称作数据类型。

变量

JavaScript
的变量是无动于衷类型的,所谓松散类型正是足以用来保存任何类型的多少。换句话说,每一个变量仅仅是七个用于保存值的占位符而已。定义变量时要运用首要字
var 来注明的,如下所示:

var message;

那行代码定义了2个名为 message
的变量,该变量能够用来保存任何值(像那样未通过初步化的变量,会保留贰个奇特的值
undefined)。JavaScript
也援助直接开头化变量,由此在概念变量的还要就足以安装变量的值,如下所示:

var message = "hello";

此时,变量 message 中保存了3个字符串值
"hello"。像这么开头化变量并不会把它标志为字符串类型,因而,能够在修改变量值的还要修改值的体系。如下所示:

var message = "hello";
message = 100;           // 有效的语句,不好的写法

在这一个例子中,变量 message 一上马保存了1个字符串值
"hello",然后该值又被3个数字值100替代。就算大家不建议修改变量所保存值的连串,但那种操作在
JavaScript 中全然可行。

有一些供给注意,即便用 var
运算符定义的变量是的该作用域中的局地变量。也便是说,假诺在函数中选取
var 定义1个变量,那么那几个变量在函数退出后就会被销毁,例如:

function test(){
    var message = "hello";  // 局部变量
}
test();
console.log(message);   // 产生错误

这里,变量 message 是在函数中应用 var
定义的,是局部变量。当函数被调用时,就会创建该变量并为其赋值。而在此之后,那一个变量又会立马被销毁,由此例子中的下一行代码就会导致错误。可是,能够像上边那样省略
var 运算符,从而创设二个全局变量:

function test(){
    message = "hello";  // 全局变量,不好的写法
}
test();
console.log(message);   // "hello"

其一例子省略了 var 运算符,因而 message
就成了全局变量。那样,只要调用2回 test()
函数,那几个变量就有了概念,就足以在函数外部的别的地方被访问到。

即便省略 var
运算符能够定义全局变量,但那也不是引进的做法,因为在部分作用域中定义全局变量很难保险,给未经注脚的变量赋值在从严情势下会抛出
ReferenceError 错误。

数据类型

JavaScript
中有5种简易数据类型(也叫做「基本数据类型」或「原始数据类型」):UndefinedNullBooleanNumberString
。还有1种复杂数据类型 ObjectObject
本质上是由一组冬日,冬辰的名值对组合的。JavaScript
不帮助任何创制自定义类型的体制,全部值最终都将是上述6种数据类型之一。

typeof 运算符

是因为 JavaScript
是东风吹马耳类型的,由此需求有一种手段来检测给定变量的数据类型,typeof
便是负责提供那方面音信的运算符。对三个值使用 typeof
运算符大概回到下列有些字符串:

  • "undefined",倘诺那一个值未注明或已证明但未起先化。
  • "boolean",假如那么些值是布尔值。
  • "string",如若这一个值是字符串。
  • "number",要是这么些值是数值。
  • "object",若是这几个值是指标或 null
  • "function",若是那么些值是函数。

上面是多少个利用 typeof 运算符的事例:

var message = "some string";
console.log(typeof message);     // "string"
console.log(typeof(message));    // "string"
console.log(typeof 95);          // "number"

从以上例子能够见见,typeof
运算符既能够对变量使用,又有何不可对字面量使用。由于 typeof
是一个运算符而不是函数,由此例子中的圆括号尽管能够行使,但并不提倡。

typeof null 结果是 "object" 是历史遗留 Bug,在 ECMAScript
6中,曾经有提案为历史平反, 将 type null 的值修正为
"null",但最终该提案被拒。理由是野史遗留代码太多,不及继续将错就错。

从技术角度讲,函数在 JavaScript
中是指标,不是一种数据类型。然则,函数也着实有一对异样的属性,由此通过
typeof 运算符来分裂函数和别的对象是有必不可少的。

扩张阅读「为何 JavaScript 里面 typeof null 的值是 "object"?」
https://www.zhihu.com/question/21691758

增加阅读「MDN 之 typeof
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof

扩大阅读「JavaScript 检查和测试原始值、引用值、属性」
http://shijiajie.com/2016/06/20/javascript-maintainable-javascript-validate1/

推而广之阅读「JavaScript 检查和测试之 basevalidate.js」
http://shijiajie.com/2016/06/25/javascript-maintainable-javascript-basevalidatejs/

Undefined 类型

Undefined 类型唯有二个值,即 undefined。使用 var
表明变量但未对其再说伊始化时,那些变量的值正是
undefined,直接行使未证明的变量会时有发生错误。对未表明或已证明但未起头化的变量执行
typeof 运算符会再次来到 "undefined" 值,例如:

var message;    // 这个变量声明之后默认取得了 undefined 值
// var age      // 这个变量并没有声明

console.log(message);           // "undefined"
console.log(age);               // 产生错误
console.log(typeof message);    // "undefined"
console.log(typeof age);        // "undefined"

Null 类型

Null 类型也唯有3个值,即 null。它用来代表值的空缺。你能够认为
undefined 是表示系统级的、出其不意的或接近错误的值的空缺,而 null
是表示程序级的、平时的或在预料之中的值的空缺。在下列场景中应当利用
null

  • 用来开头化三个变量,那么些变量可能赋值为二个指标。
  • 科学技术,用来和一个曾经初阶化的变量相比较,那个变量能够是也足以不是2个目的。
  • 当函数的参数期望是指标时,功能参数字传送入。
  • 当函数的再次来到值期望是目的时,作用再次来到值传出。

在下列场景中不应有利用 null

  • 绝不使用 null 来检查和测试是不是传入了有个别参数。
  • 无须采取 null 来检查和测试2个未初阶化的变量。

Boolean 类型

Boolean 类型是 JavaScript
中选用得最多的一种档次,该项目只有多少个字票面价值:true
false。需求小心的是,他们是分别轻重缓急写的,也正是说 True
False(以及其余的混杂大小写格局)都不是 Boolean 值,只是标识符。

虽然 Boolean 类型的字票面价值只有七个,但 JavaScript
中负有类型的值都能动用 if 语句或 Boolean() 函数转换为对应的
Boolean 值,例如:

var message = "Hello world!";
if (message){
    console.log("Value is true.");  // 被执行
}
var messageAsBoolean = Boolean(message);
console.log(messageAsBoolean);  // true

下表给出了各类数据类型及其相应的转换规则。

数据类型 转换为true的值 转换为false的值
Undefined undefined
Null null
Boolean true false
String 任何非空字符串 ""(空字符串)
Number 任何非零数字值(包括无穷大) 0和NaN
Object 任何对象

Number 类型

Number 类型是 JavaScript 中最令人关切的数据类型,那体系型应用 IEEE 754
格式来代表整数和浮点数值(浮点数值在一些语言中也被称为双精度数值)。和任何编制程序语言分化,JavaScript
中的全体数字均用浮点数值表示。

推而广之阅读「IEEE 754-壹玖捌肆」
https://en.wikipedia.org/wiki/IEEE\_754-1985

整数

在 JavaScript
中进行算术总计时,全数以八进制和十六进制表示的数值最后都将被转换来十进制数值。例如:

var a = 10;         // 十进制
var b = 023;        // 八进制
var c = 0x12ac;     // 十六进制
console.log(b);     // 19
console.log(c);     // 4780

八进制第一个人必须是0,前边跟八进制种类0到7,假若超出了限定,则忽略前导0,前面包车型大巴数值作为十进制解析,例如:089会被解析为89。(八进制字面量在严酷格局下是行不通的,会抛出荒唐。)

十六进制前两位必须是 0x 或
0X,后跟十六进制类别09、af(不区分轻重缓急写),假使过量了限制,则会报语法错误。

浮点数

所谓浮点数值,就是该数值中必须带有1个小数点,并且小数点前边总得至少有一人数字。纵然小数点前边可以没有整数,但我们不引进那种写法。例如:

var a = 1.1;
var b = 0.1;
var c = .1;     // 有效,但不推荐

JavaScript 会不失时机的将浮点数转换到整数。例如:

var a = 5.;      // 解析成整数5
var b = 5.0;     // 解析成整数5

对于非常大或然一点都不大的数值,可应用科学和技术法(也称e表示法)。JavaScript
会将那几个小数点前边带有四个零上述的小于1的浮点数值转换为以e表示法表示的数值。例如:

var a = 3.14e7;             // 等于31400000
var b = 3.14E-7;            // 等于0.000000314
console.log(0.0000003);     // 3e-7

浮点数值的参天精度是1两个人小数,但在拓展算术总结时其精确度远远不及整数,例如:

console.log(0.1 + 0.2);     // 0.30000000000000004

这几个舍入误差会导致不大概测试特定的浮点数值,因而,世世代代不要测试某些特定的浮点数值

正无穷、负无穷

鉴于内部存款和储蓄器限制,JavaScript 能表示的数值范围从 Number.MIN_VALUE
Number.MAX_VALUE,并将超出范围的数转换来 Number.POSITIVE_INFINITY
Number.NEGATIVE_INFINITY。0作为除数是不会报错的,正数除以0重回正无穷,负数除以0重返负无穷,0除以0重返NaN。例如:

console.log(Number.MAX_VALUE);       // 最大数 1.7976931348623157e+308
console.log(Number.MIN_VALUE);       // 最小数 5e-324

console.log(Number.POSITIVE_INFINITY);    // 正无穷  Infinity
console.log(Number.NEGATIVE_INFINITY);    // 负无穷 -Infinity

console.log( 1 / 0);     //  Infinity
console.log(-1 / 0);     // -Infinity

JavaScript 提供了 isFinite() 函数,来显著四个数是还是不是西周的。例如:

console.log(isFinite(100));         // true
console.log(isFinite(Infinity));    // false 

NaN

NaN(not a
number),是一个奇异的数值。之所以称它为「非数值」,是因为它不可能加入算数运算,任何关系
NaN 的操作都回去 NaN。并且 NaN
与别的值都不等于(蕴含自家)。例如:

console.log(typeof NaN);      // "number"

console.log(0 / 0);                 // NaN
console.log(NaN - NaN);             // NaN
console.log(Infinity - Infinity);   // NaN

var a = NaN;
console.log(a === a);   // false

JavaScript 提供了 isNaN() 函数,来规定一个数是还是不是 NaN。例如:

console.log(isNaN(100));        //  false
console.log(isNaN("100"));      //  false
console.log(isNaN(true));       //  false
console.log(isNaN("sss"));      //  true
console.log(isNaN(NaN));        //  true

Number()parseInt()parseFloat() 转型函数

isNaN() 函数在接到到三个值之后,会尝试采取转型函数 Number()
将这些值转换为数值,转换规则如下:

  • undefined 转换为 NaN
  • null 转换为 0;
  • true 转换为 1false 转换为 0
  • number 整数转换为十进制,小数不变;
  • string
    假如只含有十进制数和小数,则赶回对应的数值,假诺只包括八进制数,则忽略前导0再次回到剩余部分,假若只含有十六进制,则赶回十进制数,空字符串转换为0,其余字符串转换为
    NaN
  • object 先则调用对象的 valueOf()
    方法,然后依据前边的平整转换再次来到的值。假若转换的结果是
    NaN,则调用对象的 toString()
    方法,然后再度根据前边的规则转换重返的字符串值。

由于 Number()
转型函数在更换字符串时不够美观,由此还有多少个专门用来转换字符串的函数
parseInt()parseFloat() 函数。

parseInt()
函数会忽略字符串前边的空格,直至找到第3个非空格字符,只要第3个非空格字符不是数字只怕正负号,一律重回
NaN, 假如第一个非空格字符是数字字符,parseInt()
会继续分析第二个字符,直到解析完全体继续字符恐怕蒙受了1个非数字字符。例如:

console.log(parseInt(""));          // NaN(Number("")返回 0)
console.log(parseInt("123S"));      // 123
console.log(parseInt("12.4"));      // 12

parseFloat()
函数也会忽视字符串前边的空格,直至找到第①个非空格字符,只要第3个非空格字符不是数字也许正负号恐怕小数点,一律再次来到
NaN, 若是第一个非空格字符是上述字符之一,parseFloat()
会继续分析首个字符,直到解析完全部继续字符恐怕蒙受了二个非浮点数值。例如:

console.log(parseFloat("098.2"));       // 98.2
console.log(parseFloat("123.23.23"));   // 123.23

String 类型

String 类型用于表示由零或几个十几人 Unicode
字符组成的字符类别,即字符串。字符串能够由双引号(”)或单引号(’)表示,由此上面二种字符串的写法都以有效的:

var firstName = "Nicholas";
var lastName = 'Zakas';

JavaScript
中的那二种语法情势没有怎么分别。用双引号表示的字符串和用单引号表示的字符串完全相同。可是,以双引号开始的字符串也亟须以双引号结尾,而以单引号最先的字符串必须以单引号结尾。

String
数据类型包含部分例外的字符字面量,也叫转义类别,用于表示非打字与印刷字符,也许有所任何用途的字符。例如:\n
换行、\t 制表、\b 空格、\r 回车、\f 进纸、\\ 斜杠、\'
单引号,在用单引号表示的字符串中利用、\"
双引号,在用双引号表示的字符串中运用。

转义字符可出现在字符串中的任意地点,且长度为1。如要在字符串中突显 \
,则必须利用 \ 实行转义。例如:

console.log("\n\\".length);    // 2
console.log("\\hello");        // "\hello"(长度为6)

多数分值都能够动用持续而来的 toString()主意转换为字符串,但
undefinednull 值没有那个办法。对数值使用 toString()
方法时,能够流传三个数字基数,以此输出对应进制的字符串值。例如:

console.log(true.toString());   // "true"

var num = 10;
console.log(num.toString());    // "10"
console.log(num.toString(2));   // "1010"
console.log(num.toString(8));   // "12"
console.log(num.toString(16));  // "a"

在不清楚要转移的值是或不是 undefinednull
的情况下,还足以采取转型函数
String(),那个函数能够将别的类型的值转换为字符串。String()
函数遵从下列转换规则:

  • 只要值有 toString()
    方法,则调用该方法(没有参数)并赶回相应的结果;
  • 即使值是 undefined,则返回 "undefined"
  • 倘若值是 null,则返回 "null"

var value;
console.log(String(10));        // "10"
console.log(String(true));      // "true"
console.log(String(null));      // "null"
console.log(String(value));     // "undefined"

Object 类型

JavaScript 中具备指标都持续自 Object
类型,各种对象都具有下列基本的本性和章程:

  • constructor:保存着用于创制当前指标的函数(构造函数)。
  • hasOwnProperty():用于检查给定的品质在时下目标实例中是还是不是留存。
  • propertyIsEnumerable():用于检查给定的性子是或不是能够使用for-in语句来枚举。
  • isPrototypeOf():用于检核对象是还是不是是传入对象的原型。
  • toString() 方法:再次回到对象的字符串表示。
  • toLocaleString():重返对象的本土字符串表示。
  • valueOf():再次回到对象的字符串、数值或布尔值表示(平常与toString()方法的再次回到值相同)。

Object 本质上是由一组冬天的名值对组合,「名称」部分是一个 JavaScript
字符串,「值」部分能够是别的 JavaScript
的数据类型(包含对象和方法)。那使用户能够依照现实需要,创造出相当复杂的数据结构。

以下二种办法都得以创立四个空对象,这二种艺术在语义上是同一的。第一种更有利于的办法叫作「对象字面量」法。那也是
JSON 格式的主导语法,一般我们先行选项第②种办法。例如:

var obj = new Object();
var obj = {};   // 好的写法

「对象字面量」也足以用来在目的实例中定义贰个目的:

var obj = {
    name: "Carrot",
    "for": "Max",
    details: {
        color: "orange",
        size: 12
    }
}

指标的性情能够通过链式(chain)表示方法举办走访:

obj.details.color;       // orange
obj["details"]["size"];  // 12

成就创造后,对象属性能够由此如下三种方法开始展览赋值和走访:

obj.name = "Simon"      // 赋值
var name = obj.name;    // 访问

obj["name"] = "Simon";  // 赋值
var name = obj["name"]; // 访问

关卡

// 挑战一
console.log(typeof "undefined");  // ???
console.log(typeof null);         // ???

// 挑战二
var message = "some string";
console.log(typeof massage);    // ???
message = 10000;
console.log(typeof message);    // ???

// 挑战三
var a;
var b = null;
var c = {};
if(a && b && c){
    console.log("true.");       // ???
}else{
    console.log("false.");      // ???
}

// 挑战四
console.log(typeof (0 / 0));    // ???
console.log(023 + 123);         // ???

// 挑战五
console.log(Number("1234S"));   // ???
console.log(parseInt("1234S")); // ???

// 挑战六
console.log(3.14E-7 === 0.000000314);   // ???
console.log(0.1 + 0.6 === 0.7); // ???
console.log(0.1 + 0.7 === 0.8); // ???
console.log(NaN === NaN);       // ???

// 挑战七
console.log("\right\now");          // ???
console.log("\right\now".length);   // ???
console.log(010.toString(2));       // ???

// 挑战八
// 1、为 person、wife、child 对象新增 weight 属性,数值分别为 62、36、15。
// 2、为 person 对象新增二胎 child2 子对象,name 为 emma,其他属性自行发挥。
var person = {
    name: "stone",
    age: 30,
    wife: {
        name: "sohpie",
        age: 30
    },
    child:{
        name: "tommy",
        age: 3
    }
}

挑衅九,深度阅读下边两篇小说,建议你的疑问。

「JavaScript 检测原始值、引用值、属性」
http://shijiajie.com/2016/06/20/javascript-maintainable-javascript-validate1/

「JavaScript 检测之 basevalidate.js」
http://shijiajie.com/2016/06/25/javascript-maintainable-javascript-basevalidatejs/

更多

关心微信公众号「劼哥舍」回复「答案」,获取关卡详解。
关注
https://github.com/stone0090/javascript-lessons,获取最新动态。

Leave a Comment.