单挑JavaScript系列——语法和数据类型

238 阅读5分钟

本文说明:由于文章都是个人的重学侧重,会大量出现MDN的原文以及混乱说明,并不能作为学习语言的入口,仅适用于个人知识总结,偿还技术理论债的意思咱就是说。

数据类型

最新的 ECMAScript 标准定义了8种数据类型:

  • 七种基本数据类型:

    • 布尔值(Boolean),有2个值分别是:true 和 false.
    • null , 一个表明 null 值的特殊关键字。 JavaScript 是大小写敏感的,因此 null 与 NullNULL或变体完全不同。
    • undefined ,和 null 一样是一个特殊的关键字,undefined 表示变量未赋值时的属性。
    • 数字(Number),整数或浮点数,例如: 42 或者 3.14159
    • 任意精度的整数 (BigInt) ,可以安全地存储和操作大整数,甚至可以超过数字的安全整数限制。
    • 字符串(String),字符串是一串表示文本值的字符序列,例如:"Howdy" 。
    • 代表(Symbol) ( 在 ECMAScript 6 中新添加的类型).。一种实例是唯一且不可改变的数据类型。
  • 以及对象(Object)。

虽然这些数据类型相对来说比较少,但是通过他们你可以在程序中开发有用的功能。对象(Objects)和函数(functions)是这门语言的另外两个基本元素。你可以把对象当作存放值的一个命名容器,然后将函数当作你的程序能够执行的步骤。

  • 数据类型应该比较好理解,不过还是引申一下

值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。

引用数据类型:对象(Object)、数组(Array)、函数(Function)。

  • 数据类型的转换

JavaScript是一种动态类型语言(dynamically typed language)。这意味着你在声明变量时可以不必指定数据类型,而数据类型会在代码执行时会根据需要自动转换。因此,你可以按照如下方式来定义变量:

var answer = 42; 然后,你还可以给同一个变量赋予一个字符串值,例如:

answer = "Thanks for all the fish..."; 因为 JavaScript 是动态类型的,这种赋值方式并不会提示出错。

在涉及其它运算符(译注:如下面的减号'-')时,JavaScript语言不会把数字变为字符串。例如(译注:第一例是数学运算,第二例是字符串运算):

"37" - 7 // 30
"37" + 7 // "377"

  • 字符串转数字 一元加法运算符
"1.1" + "1.1" = "1.11.1"
(+"1.1") + (+"1.1") = 2.2
// 注意:加入括号为清楚起见,不是必需的。

有一些方法可以将内存中表示一个数字的字符串转换为对应的数字。like parseInt()和parseFloat()

  • 字面量 (Literals)

在JavaScript中,你可以使用各种字面量。这些字面量是脚本中按字面意思给出的固定的值,而不是变量。(译注:字面量是常量,其值是固定的,而且在程序脚本运行中不可更改,比如false,3.1415,thisIsStringOfHelloworld ,invokedFunction: myFunction("myArgument")。本节将介绍以下类型的字面量:

(字面量,常量和变量之间的区别?)[www.jianshu.com/p/0f2816805…] //有个不太好,但是足以说明问题的解释,那就是 对象字面量就是引号引起来的部分,必须是等号右边的部分。虽然这样的解释不太好,但是确实如此,这就是字面量。

var a; //变量
const  b = 10; //b为常量,10为字面量
let str = “hello world!”; // str 为变量,hello world!为字面量

在ES2015中,还提供了一种模板字面量(template literals),模板字符串提供了一些语法糖来帮你构造字符串 ,就是介个 ``

var bob = 123;
`123${bob}123`
  • 特殊字符

\0 Null字节 \b 退格符 \f 换页符 \n 换行符 \r 回车符 \t Tab (制表符) \v 垂直制表符 ' 单引号 " 双引号 \ 反斜杠字符(\)

  • 转义字符

使用如上的特殊字符进行特定情况下的字符串的字面量转义。 var home = "c:\\temp"; //c:\temp

简单的语法

// 因为基本的用法兄弟们都会,就不会过分阐述

JavaScript 是区分大小写的,并使用 Unicode字符集

  • 变量提升

JavaScript 变量的另一个不同寻常的地方是,你可以先使用变量稍后再声明变量而不会引发异常。这一概念称为变量提升;JavaScript 变量感觉上是被“提升”或移到了函数或语句的最前面。但是,提升后的变量将返回 undefined 值。因此在使用或引用某个变量之后进行声明和初始化操作,这个被提升的变量仍将返回 undefined 值。

/**
 * 例子1
 */
console.log(x === undefined); // true
var x = 3;


/**
 * 例子2
 */
// will return a value of undefined
var myvar = "my value";

(function() {
  console.log(myvar); // undefined
  var myvar = "local value";
})();

由于存在变量提升,一个函数中所有的var语句应尽可能地放在接近函数顶部的地方。这个习惯将大大提升代码的清晰度。

在 ECMAScript 6 中,let(const)同样会被提升变量到代码块的顶部但是不会被赋予初始值。在变量声明之前引用这个变量,将抛出引用错误(ReferenceError)。这个变量将从代码块一开始的时候就处在一个“暂时性死区”,直到这个变量被声明为止。

console.log(x); // ReferenceError
let x = 3;
  • 函数提升

对于函数来说,只有函数声明会被提升到顶部,而函数表达式不会被提升。


/* 函数声明 */
foo(); // "bar"
function foo() {
  console.log("bar");
}

/* 函数表达式 */
baz(); // 类型错误:baz 不是一个函数

var baz = function() {
  console.log("bar2");
};

小结

这一章比较基础,基本上没有特别复杂的概念,可能字面量需要理解一下,基本的数据类型需要知道哪些是引用类型。转义可以理解一下,大头还是变量提升滴干活。