Web开发中会话跟踪的方法有那些
- cookie
- session
- url重写
- 隐藏input
- ip地址
JS基本数据类型
- String:用于表示文本数据。
- Number:用于表示数值,包括整数和浮点数。
- BigInt:用于表示任意精度的整数。
- Boolean:用于表示逻辑值,即true或false。
- Undefined:当一个变量被声明了,但没有被赋值时,它的值就是undefined。
- Null:表示一个空值,即没有对象值被赋予变量。
- Symbol(ES6引入):用于创建唯一的标识符
Javascript常见数据结构和设计模式-CSDN博客
JS内置对象
Javascript中Object、Array、String-CSDN博客
- 0bject是JavaScript中所有对象的父对象
- 数据封装类对象:0bject . Array . Boolean . Number和 String
- 其他对象:Function . Arguments .Math、Date 、RegExp 、Error
Javascript基本规范
Javascript有几种类型的值
- 栈:原数据类型( Undefined ,Null ,Boolean ,Number .String )
- 堆:引用数据类型(对象、数组和函数)
- 两种类型的区别是:存储位置不同;
- 原始数据类型直接存储在栈( stack )中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;
- 引用数据类型存储在堆( heap )中的对象,占据空间大、大小不固定,如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体
var person = { firstName: "John", lastName: "Doe", age: 50, greet: function() { console.log("Hello, my name is " + this.firstName + " " + this.lastName); }
}; person.greet();
Javascript创建对象的几种方式
1. 对象字面量
var person = { firstName: "John", lastName: "Doe", age: 50, greet: function() { console.log("Hello, my name is " + this.firstName + " " + this.lastName); } }; person.greet();
2. 使用
new Object()
var person = new Object(); person.firstName = "John"; person.lastName = "Doe"; person.age = 50; person.greet = function() { console.log("Hello, my name is " + this.firstName + " " + this.lastName); }; person.greet();
3. 构造函数
构造函数是一种特殊的函数,用于初始化新创建的对象。通过
new
关键字调用构造函数时,会创建一个新对象,并将这个新对象的内部[[Prototype]]
(即__proto__
)链接到构造函数的prototype
属性上,最后返回这个新对象。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); }; } var person = new Person("John", "Doe", 50); person.greet();
4. 工厂函数
工厂函数是一种封装了创建对象细节的函数,它返回一个对象。这种方法比直接使用
new Object()
更加灵活。function createPerson(firstName, lastName, age) { var obj = new Object("I'm an Object"); obj.firstName = firstName; obj.lastName = lastName; obj.age = age; obj.greet = function() { console.log("Hello, my name is " + this.firstName + " " + this.lastName); }; return obj; } var person = createPerson("John", "Doe", 50); person.greet();
5. 原型链
在JavaScript中,每个对象都有一个原型(
prototype
),对象会继承原型的属性和方法。通过修改构造函数的prototype
属性,可以实现多个实例共享同一套方法和属性。function Person(firstName, lastName, age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } Person.prototype.greet = function() { console.log("Hello, my name is " + this.firstName + " " + this.lastName); }; var person1 = new Person("John", "Doe", 50); var person2 = new Person("Jane", "Doe", 40); person1.greet(); person2.greet();
6. ES6 类
ES6引入了类的概念,使得对象的创建更加直观和易于理解。类语法是基于原型的面向对象编程的语法糖。
class Person { constructor(firstName, lastName, age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } greet() { console.log("Hello, my name is " + this.firstName + " " + this.lastName); } } var person = new Person("John", "Doe", 50); person.greet();
eval()
- 它的功能是把对应的字符串解析成JS 代码并运行
- 应该避免使用eval ,不安全,非常耗性能(2次,一次解析成js 语句,一次执行)
- 由JSON字符串转换为JSON对象的时候可以用eval, var obj =eva1(' ( ' + str +')')
null与undefined
["1", "2", "3"].map(parseInt)=[1,NAN,NAN]
但是,这里有一个需要注意的陷阱。当 map
函数对数组中的每个元素调用 parseInt
时,parseInt
实际上可以接受两个参数:第一个参数是要解析的字符串,第二个参数是基数(即数字的进制)。在 map
函数中,parseInt
被调用时,除了当前元素(即字符串)作为第一个参数外,map
函数还会传递当前元素的索引(从0开始)作为第二个参数给 parseInt
。
因此,你的代码实际上会这样执行:
- 第一个元素
"1"
,索引为0,parseInt("1", 0)
,由于基数为0,parseInt
会根据字符串的格式来解析,这里"1"
能被正确解析为十进制数1。 - 第二个元素
"2"
,索引为1,parseInt("2", 1)
,这里基数为1,但基数1不是一个有效的基数(有效的基数范围是2到36),因此parseInt
会返回NaN
(Not-a-Number)。 - 第三个元素
"3"
,索引为2,parseInt("3", 2)
,这里基数为2,但"3"
在二进制中不是一个有效的数字,因此parseInt
同样会返回NaN
。
["1", "2", "3"].map(function(item) { return parseInt(item, 10); // 或者简单地 parseInt(item)
});----------------------------------------------------------------
["1", "2", "3"].map(item => parseInt(item, 10)); // 或者简单地 ["1", "2", "3"].map(parseInt) 如果环境允许默认基数----------------------------------------------------------------------------
//拓展
let numbers = ["10", "010", "0xA"];
let decimalNumbers = numbers.map(function(item) { // 检查字符串的前缀来确定基数 if (item.startsWith("0x") || item.startsWith("0X")) { // 十六进制 return parseInt(item, 16); } else if (item.startsWith("0")) { // 假设以0开头但不是"0x"或"0X"的是八进制(注意:现代JavaScript可能默认解析为十进制) // 为了明确性,我们显式指定基数为8 return parseInt(item, 8); } else { // 十进制 return parseInt(item, 10); }
}); console.log(decimalNumbers); // 输出: [10, 8, 10]
javascript代码中的"use strict";是什么意思
在JavaScript代码中,"use strict";
是一个特殊的指令,用于启用严格模式(strict mode)。当在脚本或函数的顶部包含这个指令时,它告诉JavaScript引擎以更加严格的解释和执行代码的方式来运行代码。这有助于捕获一些常见的编码错误,使得代码更加安全、可预测和易于管理。
严格模式有几个主要的好处和限制:
-
捕获更多错误:在严格模式下,JavaScript会抛出更多的错误,从而帮助你更早地发现并修复问题。例如,它会阻止你使用未声明的变量(在未启用严格模式的情况下,这通常会导致全局变量被意外创建)。
-
禁用某些不安全或不确定的特性:严格模式会禁用或改变一些JavaScript的“不安全”特性,比如
with
语句和eval()
函数的行为。 -
使代码更加可预测:在严格模式下,JavaScript的行为在某些方面更加可预测,比如静默失败的操作(如将值赋给只读属性)会抛出错误。
-
提升性能:虽然这不是启用严格模式的主要动机,但一些JavaScript引擎在严格模式下能够执行更多的优化,因为严格模式限制了代码的行为,使得这些优化成为可能。
-
更清晰的代码意图:通过在代码顶部使用
"use strict";
,你可以明确地向其他开发者表明这段代码是以更严格的标准编写的,这有助于维护代码的质量和一致性。