1.变量
1.变量命名规则
- 严格区分大小写
- 不能以数字开头
- 不能是关键字,保留字,不能用name用作变量名
- 小驼峰命名法
- 命名符号只能用下划线 _ 和doller $并且中间不能有空格
2.类型推断
JavaScript是一种动态类型的语言,这意味着你不需要在声明变量时指定其类型。JavaScript引擎会根据你赋给变量的值来推断其类型。
3.特点
- 只声明但是不赋值-------未定义
- 不声明不赋值直接使用-------报错
- 不声明直接赋值-------可以
2.数据类型
1.基本数据类型
1.Number
用于表示整数和浮点数。在JavaScript中,所有的数字都是以64位浮点数形式存储的,即使它们被声明为整数。
在数字前面加上0就是八进制
在数字前加上0x就是表示十六进制
alert(Number.Max_VALUE)是数字里面的最大值
alert(Number.Max_VALUE)是最小值
Infinity无穷大 NaN非数字
isNaN()用来判断非数字,如果里面是数字返回假,不是数字返回真
2.String
用于表示文本数据。字符串是Unicode字符序列,由单引号(')、双引号(")或反引号(`)括起来。
字符串拼接直接用“+”, 而且可以拼接变量
转义字符:
在JavaScript中,转义字符用于表示在字符串中不能直接写入的特殊字符。这些特殊字符前面加上反斜杠(\
)来“转义”它们,使它们具有特殊的含义或表示一个无法直接输入的字符。以下是一些常用的转义字符:
\n
:换行符。在字符串中插入一个新行。
console.log("Hello\nWorld"); // 输出:
// Hello
// World
\t
:制表符(Tab)。在字符串中插入一个制表符,通常用于缩进。
javascript复制代码console.log("Hello\tWorld"); // 输出:Hello World(制表符的位置取决于控制台或编辑器的设置)
\\
:反斜杠字符本身。由于反斜杠是转义字符的前缀,所以要在字符串中表示一个反斜杠,需要使用两个反斜杠。
javascript复制代码console.log("This is a backslash: \\"); // 输出:This is a backslash: \
\'
:单引号字符。在单引号字符串中插入单引号字符。
let str = 'This is a string with a \'single quote\' in it.';
console.log(str); // 输出:This is a string with a 'single quote' in it.
\"
:双引号字符。在双引号字符串中插入双引号字符。
let str = "This is a string with a \"double quote\" in it.";
console.log(str); // 输出:This is a string with a "double quote" in it.
3.Boolean
用于表示逻辑值,可以是 true
或 false
。
在加法当中分别表示1和0
4.null
表示一个空值或没有值。null
是一个字面量,表示没有对象值。
5.undefined
undefined
是 JavaScript 中的一个基本数据类型,它表示变量已声明但尚未被赋值。当一个变量被声明了但没有被明确赋值时,它的值就是 undefined
。此外,undefined
也可以作为一个全局变量来访问,但它的作用主要是用来表示变量未定义的状态。
未定义类型和数字相加结果是NaN,与字符串相加得到的是undefine和该字符拼接后的结果
2.复杂数据类型
1.Array
用于表示有序的数据集合。数组是特殊的对象,可以包含多个元素(原始值或对象),这些元素可以通过索引来访问。
声明数组:
-
利用new关键字
var arr = new Array(); //创建了一个空数组
-
利用数组字面量
var arr = []; //创建了一个空数组
调用数组元素:
要修改或者使用数组里面的元素时,都可以通过索引来对其进行操作
新增数组元素:
- 通过修改数组长度:每个数组都有一个
length
属性,表示数组中的元素数量。这个属性是可写的,但通常不建议直接修改它,因为这可能会导致数组中出现未定义的元素。 - 追加:通过索引直接向数组后面添加元素。
2.Function
声明函数和调用函数(命名函数):
function functionName(parameters) { // 函数体,即要执行的代码块
} // 示例
function greet(name) { console.log('Hello, ' + name);
} greet('World'); // 输出 "Hello, World"
函数表达式(匿名函数):
let functionName = function(parameters) { // 函数体,即要执行的代码块
}; // 示例
let greet = function(name) { console.log('Hello, ' + name);
}; greet('World'); // 输出 "Hello, World"
函数参数:
如果实参个数多余形参个数,会按次序取到相应的形参个数
如果少于,那就会给少的形参未定义
函数的返回值:
return只能返回一个值,如果有很多个,那就返回最后一个
要返回多个值的话可以利用数组
如果没有return则返回undefined
arguments:
arguments
是一个类数组对象,它代表了传给函数的参数。这个对象仅在函数体内部可用,并且是自动可用的,无需在函数声明或函数表达式中显式声明。
arguments 的特点:
- 类数组对象:
arguments
对象不是一个真正的数组,但它具有数组的一些特性,比如长度(length
)属性和索引。然而,它并不包含数组的所有方法(如push()
,pop()
,forEach()
,map()
等)。 - 自动可用:在函数内部,
arguments
对象会自动包含所有传递给函数的参数。 - 索引:可以使用索引(从0开始)来访问
arguments
对象的每个元素,就像访问数组元素一样。 - length 属性:
arguments.length
属性表示传递给函数的参数个数。 - 与函数参数的区别:虽然
arguments
对象和函数参数在功能上有些相似,但它们是两个不同的东西。函数参数是在函数声明或函数表达式中定义的,而arguments
对象是在函数体内部自动可用的。
3.Object
对象(Object)是一种复合数据类型,用于存储多个值(称为属性)作为单个实体。这些值可以是原始数据类型(如字符串、数字、布尔值等),也可以是其他对象。对象还允许你定义与这些值相关联的行为(称为方法)。
创建对象:
1.对象字面量:这是创建对象的最常见方式。
let person = { firstName: 'Alice', lastName: 'Smith', age: 30, greet: function() { console.log(`Hello, my name is ${this.firstName} ${this.lastName}.`); }
};
2.构造函数:使用new
关键字和自定义的构造函数函数来创建对象。
function Person(firstName, lastName, age) { this.firstName = firstName; this.lastName = lastName; this.age = age; this.greet = function() { console.log(`Hello, my name is ${this.firstName} ${this.lastName}.`); };
} let person = new Person('Alice', 'Smith', 30);
注意调用函数的时候在前面加上new
,相当于申请了一个空对象
3.直接创建空对象,然后追加属性:var obj = new Object();
创建了一个空的对象,然后之后再追加属性和方法
var obj = new Object(); // 添加一个字符串属性
obj.name = "Alice"; // 添加一个数字属性
obj.age = 30; // 添加一个方法
obj.greet = function() { console.log("Hello, my name is " + this.name);
}; obj.greet(); // 输出 "Hello, my name is Alice"
console.log(obj.name); // 输出 "Alice"
console.log(obj.age); // 输出 30
对象的属性:
调用属性的方法:
- 对象名.属性名
- 对象名[‘属性名’] (不要忘记引号)
当调用函数的时候:对象名.方法名() (不要忘记小括号)
遍历对象的属性:
使用 for...in
循环:
for(变量 in 对象) {
console.log(变量) //得到的是属性名
console.log(obj[变量]); //得到的是属性值
}
示例:
var obj = { name: "Alice", age: 30, job: "Engineer"
}; for (var key in obj) { if (obj.hasOwnProperty(key)) { // 使用 hasOwnProperty 方法检查属性是否属于对象本身 console.log(key + ": " + obj[key]); }
}
3.预解析
运行js分为两步: 预解析 代码执行
- 变量提升 就是把所有的变量声明提升到当前作用域的最前面,不提升赋值操作
- 函数提升 就是把所有的函数声明提升到当前作用域的最前面,不调用函数
当在函数里面调用var a = b = c = d = 9 时,注意这里只有a是局部变量,其他是全局变量,因为只有a接受声明了
例如:
console.log(myVar); // 输出:undefined
var myVar = "Hello, World!";
虽然myVar
的赋值是在console.log
之后,但JavaScript引擎会将var myVar;
的声明提升到函数或全局作用域的最顶部。因此,console.log(myVar);
不会报错,但会输出undefined
,因为变量的赋值还没有发生。
console.log(myFunction()); // 输出:Hello, Function! function myFunction() { return "Hello, Function!";
}
在这个例子中,myFunction
函数声明被提升到了最顶部,所以console.log(myFunction());
能够正常调用该函数并输出"Hello, Function!"
。
注意事项
- 函数声明与函数表达式:函数声明(使用
function myFunction() {...}
语法)会被提升,但函数表达式(使用var myFunction = function() {...}
或let/const myFunction = function() {...}
语法)不会被提升。函数表达式是赋值操作的一部分,它们遵循变量提升的规则。 let
和const
:使用let
和const
关键字声明的变量不会被提升到其所在作用域的最顶部。相反,它们会被“块级作用域化”,这意味着它们只在声明它们的代码块内可用。此外,let
和const
声明的变量还有一个“暂时性死区”(Temporal Dead Zone, TDZ),在变量被声明但尚未被赋值之前的区域内引用该变量会导致引用错误(ReferenceError)。