JavaScript语法
语法
1.严格区分大小写
2.标识符
标识符:在JS中所有的可以由我们自主命名的都可以称之为标识符。
例如:变量名、函数名、属性名都是属于标识符。
1.建议用驼峰命名规则:getElementById/matherAndFather/aaaOrBbbAndCcc
2.变量命名必须以字母或是下标符号”_”或者”$”为开头
3.注释
(1)html的注释:
<!-- 注释 -->
(2)CSS的注释:
<style type="text/css">
/*
注释
*/
p{
}
</style>
注意:CSS只有/* */这种注释,没有//这种注释。而且注释要写在<style>标签里面才算生效哦。
(3)JavaScript的注释:
单行注释:
// 我是注释
多行注释:
/*
多行注释1
多行注释2
*/
备注:常用的编辑器中,单行注释的快捷键是ctrl+/,多行注释的快捷键是ctrl+shift+/。
4.JavaScript对换行、缩进、空格不敏感。每一条语句以分号结尾。
备注:每一条语句末尾要加上分号,虽然分号不是必须加的,如果不写分号,浏览器会自动添加,但是会消耗一些系统资源。
5.所有的符号,都是英语的。比如括号、引号、分号。
变量
有 3 个关键字可以声明变量:var、const 和 let。其中,var 在 ECMAScript 的所有版本中都可以使用,而 const 和 let 只能在 ECMAScript 6 及更晚的版本中使用。
var关键字
要定义变量,可以使用 var 操作符(注意 var 是一个关键字),后跟变量名(即标识符,如前所述):
var message;
- var 声明作用域
使用 var 操作符定义的变量会成为包含它的函数的局部变量。比如,使用 var 在一个函数内部定义一个变量,就意味着该变量将在函数退出时被销毁:
function test() {
var message = “hi”; // 局部变量
}
test();
console.log(message); // 出错!
全局变量:
function test() {
message = “hi”; // 全局变量 }
test();
console.log(message); // “hi”
去掉之前的 var 操作符之后,message 就变成了全局变量。只要调用一次函数 test(),就会定义 这个变量,并且可以在函数外部访问到。
var 声明提升
JavaScript在解释执行之前,有预编译的过程,会将变量声明提升到最前面,但是不会将赋值提升.
3.3.2 let声明
let 跟 var 的作用差不多,但有着非常重要的区别。最明显的区别是,let 声明的范围是块作用域, 而 var 声明的范围是函数作用域
. 暂时性死区
let 与 var 的另一个重要的区别,就是 let 声明的变量不会在作用域中被提升。
在 let 声明之前的执行瞬间被称为“暂时性死区”(temporal dead zone),在此 阶段引用任何后面才声明的变量都会抛出 ReferenceError。
const声明
const 的行为与 let 基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且 尝试修改 const 声明的变量会导致运行时错误。
const age = 26;
age = 36; // TypeError: 给常量赋值
29
// const 也不允许重复声明
const name = ‘Matt’;
const name = ‘Nicholas’; // SyntaxError
// const 声明的作用域也是块 const name = ‘Matt’;
if (true) {
const name = ‘Nicholas’;
}
console.log(name); // Matt
数据类型
在JS中一共有六种数据类型:
基本数据类型(值类型):String 字符串、Number 数值、Boolean 布尔值、Null 空值、Undefined 未定义,symbol 符号
引用数据类型(引用类型):Object 对象。
注意:内置对象function、Array、Date、RegExp、Error等都是属于Object类型。也就是说,除了那五种基本数据类型之外,其他的,都称之为 Object类型。
引用数据类型有几种?
只有一种,即 Object 类型
typeof()表示“获取变量的类型”,返回的是小写
使用 typeof 操作符的例子:
let message = “some string”;
console.log(typeof message);
console.log(typeof(message));
console.log(typeof 95);
// “string”
// “string”
// “number”
调用 typeof null 返回的是"object"。这是因为特殊值 null 被认为是一个对空对象的引用。
undefind
undefined:未定义
声明了一个变量,但是没有赋值(例如:var a;),此时它的值就是undefined。
注意,包含 undefined 值的变量跟未定义变量是有区别的。请看下面的例子: let message; // 这个变量被声明了,只是值为undefined
// 确保没有声明过这个变量
// let age
console.log(message);
// “undefined” console.log(age); // 报错
在对未初始化的变量调用 typeof 时,返回的结果是"undefined",但对未声明的变量调用它时, 返回的结果还是"undefined",这就有点让人看不懂了。比如下面的例子:
let message; // 这个变量被声明了,只是值为undefined // 确保没有声明过这个变量
// let age
console.log(typeof message); // “undefined”
console.log(typeof age); // “undefined”
Undefined类型的值只有一个,就是undefind
使用 type of 检查一个undefined时,会返回undefined。
null和undefined有最大的相似性。看看null == undefined的结果(true)也就更加能说明这点。
但是null === undefined的结果(false)。它们虽然相似,但还是有区别的,其中一个区别是:和数字运算时,10 + null结果为:10;10 + undefined结果为:NaN。
任何数据类型和undefined运算都是NaN;
任何值和null运算,null可看做0运算
null
null:空值
专门用来表示一个为空的对象(例如:var a = null)。注意,专门用来表示空对象。
Null类型的值只有一个,就是null。比如:var a = null。
使用 typeof 检查一个null值时,会返回object。
布尔值:Boolean
true 和 false。主要用来做逻辑判断。
布尔值直接使用就可以了,千万不要加上引号。
代码:
var a = true;
console.log(typeof a);
控制台输出结果:
boolean
数值型:Number
在JS中所有的数值都是Number类型,包括整数和浮点数(小数)。
var a = 100; //定义了一个变量a,并且赋值100
console.log(typeof a); //输出a变量的类型
上方代码的输出结果为:
number
由于内存的限制,ECMAScript 并不能保存世界上所有的数值。
最大值:Number.MAX_VALUE,这个值为: 1.7976931348623157e+308
最小值:Number.MIN_VALUE,这个值为: 5e-324
如果使用Number表示的变量超过了最大值,则会返回Infinity。
无穷大(正无穷):Infinity
无穷小(负无穷):-Infinity
注意:typeof Infinity的返回结果是number。
NaN和isNaN()函数:
(1)NaN:是一个特殊的数字,表示Not a Number,非数值。比如:
console.log("abc" / 18); //结果是NaN
console.log(“abc” * “abcd”); //按理说,字符串相乘是没有结果的,但如果你非要让JS去算,它就一定会给你一个结果。结果是NaN
注意:typeof NaN的返回结果是number。
Undefined和任何数值计算的结果为NaN。NaN 与任何值都不相等,包括 NaN 本身。
(2)**isNaN() :任何不能被转换为数值的值,都会让这个函数返回 true。**注意:这里是会对内容进行类型转换!
isNaN(NaN);// true
isNaN("blue"); // true
isNaN(123); // false
浮点数的运算:
在JS中,整数的运算基本可以保证精确;但是小数的运算,可能会得到一个不精确的结果。所以,千万不要使用JS进行对精确度要求比较高的运算。
如下:
var a = 0.1 + 0.2;
console.log(a); //打印结果:0.30000000000000004
上方代码中,打印结果并不是0.3,而是0.30000000000000004。运算都要转换成二进制去计算,然而,二进制是无法精确表示1/10的。因此存在小数的计算不精确的问题。
连字符和加号的区别
键盘上的+可能是连字符,也可能是数字的加号。如下:
console.log("我" + "爱" + "你"); //连字符,把三个独立的汉字,连接在一起了
console.log("我+爱+你"); //原样输出
console.log(1+2+3); //输出6
输出:
我爱你
我+爱+你
6
总结:如果加号两边都是数值,此时是加。否则,就是连字符(用来连接字符串)。
举例1:
var a = "1";
var b = 2;
console.log(a + b);
控制台输出:
12
举例2:
var a = 1;
var b = 2;
console.log("a" + b); //"a"就不是变量了!所以就是"a"+2 输出a2
控制台输出:
a2
在变量中加入字符串进行拼接,可以被同化为字符串。【重要】
String 字符串
来看个示例。现有如下代码:
var a = "abcde";
var b = "生命壹号";
var c = "123123";
var d = "哈哈哈哈哈";
var e = ""; //空字符串
console.log(typeof a);
console.log(typeof b);
console.log(typeof c);
console.log(typeof d);
console.log(typeof e);
控制台输出如下:
string
string
string
string
string
注意事项:
(1)在JS中,字符串需要使用引号引起来。使用双引号或单引号都可以,但是不要混着用。比如下面这样写是不可以的:
var str = `hello";
(2)引号不能嵌套:双引号里不能再放双引号,单引号里不能再放单引号。但是单引号里可以嵌套双引号。
(3)转义字符:在字符串中我们可以使用\作为转义字符,当表示一些特殊符号时可以使用\进行转义。
" 表示 "
’ 表示 ’
\n 表示换行
\r 表示回车
\t 表示制表符
\b 表示空格
\ 表示
举例:
var str1 = "我说:\"今天\t天气真不错!\"";
var str2 = "\\\\\\";
console.log(str1);
console.log(str2);
上方代码的打印结果:
我说:"今天 天气真不错!"
\\\
将其他数值转换为字符串有三种方式:
拼串,toString(),String()
Symbol类型
Symbol(符号)是 ECMAScript 6 新增的数据类型。符号是原始值,且符号实例是唯一、不可变的。 符号的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险。
- 符号的基本用法
符号需要使用 Symbol()函数初始化。
let sym = Symbol();
console.log(typeof sym); // symbol
Object类型
对象通过 new 操作符后跟对象类型的名称 来创建。
let o = new Object();
let o = new Object; // 合法,但不推荐
ECMAScript 中的 Object 也是派生其他对象的基类。Object 类型的所有属性和方法在派生 的对象上同样存在。
每个 Object 实例都有如下属性和方法。
constructor:用于创建当前对象的函数。
hasOwnProperty(propertyName):用于判断当前对象实例(不是原型)上是否存在给定的属
isPrototypeOf(object):用于判断当前对象是否为另一个对象的原型。
propertyIsEnumerable(propertyName):用于判断给定的属性是否可以使用
toLocaleString():返回对象的字符串表示,该字符串反映对象所在的本地化执行环境。
toString():返回对象的字符串表示。
valueOf():返回对象对应的字符串、数值或布尔值表示。