一、JavaScript的基本概念:
1、JavaScript 是一种多范式的动态语言,它包含类型、运算符、标准内置( built-in)对象和方法。
2、JavaScript 通过原型链而不是类来支持面向对象编程
3、JavaScript同样支持函数编程-因为它们也是对象,函数也可以被保存在变量中,并且像其他对象一样被传递。
二、引入JS代码
1、JavaScript代码可以放到一个单独的文件中,然后用src属性添加到HTML文件中:<script src="./main.js"></script>
2、还可以是一个完整的URL地址,例如:
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.2.0/lodash.js"></script>
3、附加多个脚本,使用多个标签:
<script src="/js/script1.js"></script>
<script src="/js/script2.js"></script>
…
4、如果设置了src属性,<script>标签内包裹的内容就会被忽略。所以,必须选择要么用src属性引入外部js文件,要么就使用<script>标签包裹住代码。
三、代码结构
1、语句
语句是执行操作的语法结构和命令。可以在代码中编辑任意数量的语句,语句之间使用分号分割。通常,每条语句在单独的一行书写,这会提高代码的可读性。
2、分号
多数情况下,当一个分行符存在时,分号是可以省略的。但是建议加上分号。
3、注释
单行注释: 以两个正斜杠字符//
开始
多行注释: 以/*
开始以*/
结束。快捷键(选择代码后 按Ctrl+Shift+/
)
注释对生产没有任何负面影响!
4、use strict严格模式
4.1、当use strict
处于脚本文件顶部时,则整个文件都将以严格模式进行工作。
4.2、use strict
可以放在函数(大多数函数)而不是整个脚本的开头,那么严格模式仅在该函数中启用。
4.3、确保use strict
出现在脚本的最顶部,否则严格模式无法启用,只有注释可以出现在use strict
的上面。
4.4、没有办法取消use strict
。
4.5、建议按一个个函数去开启严格模式
4.6、设立use strict
的目的:
- 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 提高编译器效率,增加运行速度;
- 为未来新版本的Javascript做好铺垫。
5、变量
变量是数据的“命名存储”,用来保存一些信息。
在JavaScript中创建一个变量,需要用到let
关键字。
下面的语句创建(换句话说,声明或者定义)了一个名称为“message”的变量:
let message;
现在,通过赋值操作符 =
为变量添加一些数据:
let message;
message = 'Hello'; // 保存字符串
简洁一点,将变量定义和赋值组合在一起:
let message = 'Hello!'; // 定义变量,并且赋值
也可以在一行中声明多个变量:
let user = 'John', age = 25, message = 'Hello';
可以把变量想象为一个数据盒子,盒子上有一个唯一的标注盒子名字的贴纸。我们可以在盒子内放入任何值,同样,我们也可以改变它,值可以根据需要多次改变:
let message;
message = 'Hello!';
message = 'World!'; // 值改变了
alert(message);
当值改变的时候,先前的数据就从变量中删除了。
还可以声明两个变量,然后将其中一个变量的数据拷贝进另一个变量。
let hello = 'Hello world!';
let message;
// 将字符串 'Hello world' 从变量 hello 拷贝进 message
message = hello;
// 现在两个变量保存着相同的数据
alert(hello); // Hello world!
alert(message); // Hello world!
5.1、变量命名
- JavaScript 的变量命名有两个限制:
变量名称必须仅包含字母,数字,符号 $ 和 _。
首字符必须非数字。
如果命名包括多个单词,每个单词以大写字母开头,如:myVeryLongName
。 -
命名区分大小
命名为apple
和AppLE
的变量是不同的两个变量。 - 命名可以使用非英文字母,比如中文,但不推荐。
- 保留字,有一张保留字列表无法用作变量命名,因为它们被语言本身采用了。
比如,单词let
、class
、return
、function
被保留。 - 一个变量名应该有一个清晰、明显的含义,描述了它存储的数据。
6、常量
声明一个常数(不变)变量,可以使用 const
而非let
:
const myBirthday = '18.04.1982';
使用 const 声明的变量称为“常量”。它们不能被修改,尝试这样做就会造成错误:
const myBirthday = '18.04.1982';
myBirthday = '01.01.2001'; // 错误,不能对常量重新赋值
能确定这个变量永远不会改变的时候,就可以使用 const 来确保这种行为,并且清楚地向别人传递这一事实。
四、数据类型
JavaScript 中有七种基本数据类型
1、Number类型 (数字)
- number 类型用于整数和浮点数。
- 除了常规的数字,还包括“特殊数值”也属于这种类型:
Infinity
、-Infinity
和NaN
。
-
Infinity
代表数学概念中的无穷大∞。是一个比任何数字都大的特殊值。我们可以通过除以 0 来得到它。
alert( 1 / 0 ); // Infinity
或者在代码中直接提及它:
alert( Infinity ); // Infinity
NaN
代表一个计算错误。它是一个不对的或者一个未定义的数学操作所得到的结果,比如:
alert( "not a number" / 2 ); // NaN, 这样的除法是错误的
2、String类型 (字符串)
- JavaScript 中的字符串必须被包含在引号里面。
- 在 JavaScript 中,有三种包含字符串的方式。
双引号: ""
单引号: ''
反引号: `` - 双引号和单引号都是“简单”引用,在 JavaScript 中两者并没有什么差别。
- 反引号是功能扩展的引用,允许通过
${…}
,将变量和表达式嵌入到字符串中。例如:
let name = "John";
// 嵌入一个变量
alert( `Hello, ${name}!` ); // Hello, John!
// 嵌入一个表达式
alert( `the result is ${1 + 2}` ); // the result is 3
${…}
内的表达式会被计算,结果成为字符串的一部分。可以在${…}
内放置任何东西:诸如 name 的变量,或者诸如 1 + 2 的算数表达式,或者其他一些更复杂的。
需要注意的是,这仅仅在反引号内有效,其他引号不允许这种嵌入。
alert( "the result is ${1 + 2}" ); // the result is ${1 + 2} (双引号什么也不做)
- 转义字符
\
可以转义很多字符,比如\n
表示换行,\t
表示制表符,字符\
本身也要转义,所以\\
表示的字符就是\
。 - ``也可以用来包含多行字符串,如:
`这是一个
多行
字符串`;
-
操作字符串
字符串常见的操作如下:
var s = 'Hello, world!';
s.length; // 13
要获取字符串某个指定位置的字符,使用类似Array的下标操作,索引号从0开始:
var s = 'Hello, world!';
s[0]; // 'H'
s[6]; // ' '
s[7]; // 'w'
s[12]; // '!'
s[13]; // undefined 超出范围的索引不会报错,但一律返回undefined
需要特别注意的是,字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果:
-
toUpperCase
toUpperCase()
把一个字符串全部变为大写:
var s = 'Hello';
s.toUpperCase(); // 返回'HELLO'
-
toLowerCase
toLowerCase()
把一个字符串全部变为小写:
var s = 'Hello';
var lower = s.toLowerCase(); // 返回'hello'并赋值给变量lower
lower; // 'hello'
-
indexOf
indexOf()
会搜索指定字符串出现的位置:
var s = 'hello, world';
s.indexOf('world'); // 返回7
s.indexOf('World'); // 没有找到指定的子串,返回-1
-
substring
substring()
返回指定索引区间的子串:
var s = 'hello, world'
s.substring(0, 5); // 从索引0开始到5(不包括5),返回'hello'
s.substring(7); // 从索引7开始到结束,返回'world'
3、boolean类型(布尔)
- boolean 类型只有两个值:
true
和false
。 - 这种类型通常用于存储表示 yes 或 no 的值:
true
意味着 “yes,正确”,false
意味着 “no,不正确”。
let nameFieldChecked = true; // yes, name field is checked
let ageFieldChecked = false; // no, age field is not checked
- 布尔值也可作为比较的结果:
let isGreater = 4 > 1;
alert( isGreater ); // true (比较的结果是 "yes")
4、null (空)
特殊的 null 值不属于上述任何一种类型。
它构成一个独立的类型,只包含 null
值:
let age = null;
相比较于其他语言,JavaScript 中的 null 不是一个“对不存在对象的引用”或者“null 指针”。
仅仅是一个含义为“无”、“空”或“值未知”的特殊值。
上面的代码表示,由于某些原因,age 是未知的。
5、undefined(未定义)
特殊值undefined和 null 一样,自成类型。
undefined 的含义是 未被赋值。
如果变量被声明,而未被赋值,那么它的值就是 undefined
:
let x;
alert(x); // 弹出 "undefined"
原理上来说,可以为任何变量赋值为 undefined:
let x = 123;
x = undefined;
alert(x); // "undefined"
但不建议这样做。通常,使用 null
将一个“空”或者“未知”的值写入变量中,undefined
仅仅用于检验,以查看变量是否被赋值或者其他类似的操作。
6、object类型(对象)
各种值组成的集合
array
和function
是对象的一种
语法: 以花括号({)开头,以花括号结尾(}),然后用一个变量来容纳它
7、symbol类型
symbol 用于唯一的标识符。
- 通常,数值、字符串、布尔值这三种类型,合称为原始类型(primitive type)的值,即它们是最基本的数据类型,不能再细分了。对象则称为合成类型(complex type)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。至于undefined和null,一般将它们看成两个特殊值。
typeof运算符
typeof 运算符可以查看变量的类型。
它支持两种语法形式:
- 作为运算符:typeof x。
-
函数形式:typeof(x)。
换言之,有括号和没有括号,结果是一样的。
对 typeof x 的调用返回数据类型的字符串。
typeof undefined // "undefined"
typeof 0 // "number"
typeof true // "boolean"
typeof "foo" // "string"
typeof Symbol("id") // "symbol"
typeof Math // "object"
typeof alert // "function"
Math 是一个提供数学运算的内建对象。
typeof alert 的结果是 "function",因为 alert 在语言中是一个函数。
五、数据类型转换
概念:大多数情况下,运算符和函数会自动转换将值转换为正确的类型。称之为“类型转换”。比如,alert
会自动将任何值转换为字符串。算术运算符会将值转换为数字。
有三种常用的类型转换:转换为 string 类型、转换为 number 类型和转换为 boolean 类型。
ToString
—— 输出内容时 ToString 发生转换,或通过String(value)
进行显式转换。原始类型值的string
类型转换通常是可预见的。ToNumber
– 进行算术操作时发生ToNumber
转换,或通过Number(value)
进行显式转换。ToNumber
转换遵循以下规则:
值 变成…
undefined NaN
null 0
true / false 1 / 0
string 字符串“按原样读取”,两端的空白被忽略。空字符串变成 0。出错变成 NaN。
ToBoolean
– 进行逻辑操作时发生 ToBoolean
转换。或通过 Boolean(value)
进行显式转换。
ToBoolean
遵循以下规则:
值 变成…
0, null, undefined, NaN, "" false
其他值 true