js原型链污染
JS基础数据类型:
- 基本数据类型:
String
Number
Boolean
Null
Undefined
Symbol
- 引用类型:
Object
Array
Function
变量定义:
变量定义的例子:
1
2
3
4var car = 'A'; // 定义字符串
var car = 'B'; // 另一个字符串
var x = 3.0; // 定义数字
var is = true; // 定义布尔值数组定义:
1
2
3
4
5
6var cars = new Array();
cars[0] = "A"; // 直接赋值
var cars = new Array("A", "B", "C"); // 使用Array构造函数定义
var cars = ["A", "B", "C"]; // 使用字面量定义数组
对象定义:
1 |
|
通过对象进行属性访问:
1 |
|
函数定义:
传统函数定义:
1
2function xx(a, c) {
}匿名函数赋值:
1
2var xx = function(a, c) {
};箭头函数:
1
var xx = (a, c) => {};
加法操作符的使用:
除了number+number和bool和bool其余返回string
数字与字符串的拼接:
- 数字加数字:
1 + 1 = 2
- 字符串加字符串:
"abc" + "def" = "abcdef"
- 字符串加数字:
"abc" + 1 = "abc1"
- 字符串加对象: “uert”+{person:’abc’}=uert{person:’abc’}
- 对象加对象:
[Object Object]
拼接结果 - 字符串加数组: “uert”+[“abc”,”efg”]=”uertabc”,”efg”
- 字符串加null: “uert”+null= “uertnull” 同理true和false
Python 里面不能像 JS 这样混合不同类型的数据来做拼接,但 JS 是可以的。
- 数字加数字:
其他运算符:
- fuc+fuc=”(a,b)=>{return(a+b)}(a,b)=>{return(a+b)}”
- arr+arr=”abc,efgabc,abc”
- arr+true= “abc,deftrue”
非字符串与非字符串的操作:
true + true = 2
false + false = 0
函数的简写:
- 使用箭头函数:
(a, b) => {return (a + b)}
和arr + true = abc.deftrue
。
长度属性:
String 的长度:
string.length
返回字符串的字符数。
Array 的长度:
Array.length
返回数组的元素个数。
还提到
number 没有 length
属性。
JSON 解析:
- 使用
JSON.parse()
可以将 JSON 字符串转化为对象。 - 注意到你提到
JSON.parse(null)
会返回null
。
其他:
- 使用
in
可以遍历对象的属性。 - 在最右侧提到
这里指的是数字
。
js trick
1 |
|
类型污染
first !== second && shal(salt + frist) === shal(salt + second)
POST : {“frist” : “A” “second”: [“A”]}
原型链污染
1 |
|
举例说明:
1 |
|
在这个例子中:
john
是通过new Person()
创建的对象。john.__proto__
指向Person.prototype
,它包含sayHello
方法。- 当你调用
john.sayHello()
时,JavaScript 引擎会沿着__proto__
查找这个方法,最终在Person.prototype
上找到并执行。
原型链图解
JavaScript 原型链的核心概念:
- 每个对象都有一个隐式原型(
__proto__
):- 当你创建一个对象时,该对象会有一个隐式原型指向它的构造函数的
prototype
属性。
- 当你创建一个对象时,该对象会有一个隐式原型指向它的构造函数的
- 构造函数与
prototype
属性:- 每个函数都有一个显式原型属性(
prototype
),这个属性指向通过这个构造函数创建的实例对象的原型。
- 每个函数都有一个显式原型属性(
- **对象的
__proto__
指向构造函数的prototype
**:- 例如,
let obj = new Foo();
中,obj.__proto__ === Foo.prototype
。即obj
的原型指向了Foo
构造函数的prototype
。
- 例如,
- 构造函数本身也是对象:
- 所以构造函数
Foo
也是由Function
构造出来的,它有一个__proto__
,指向Function.prototype
。
- 所以构造函数
- **终点是
null
**:- 原型链的终点是
null
,即Object.prototype.__proto__ === null
。
- 原型链的终点是
更详细的图形说明:
- Foo 对象实例:
foo.__proto__ -> Foo.prototype
- Foo 构造函数:
Foo.__proto__ -> Function.prototype
- Function 构造函数:
Function.__proto__ -> Function.prototype
Function.prototype.__proto__ -> Object.prototype
- Object 构造函数:
Object.__proto__ -> Function.prototype
Object.prototype.__proto__ -> null
这个层次结构可以这样看:
- Foo 的实例:继承自
Foo.prototype
- Foo.prototype:继承自
Object.prototype
- Foo(构造函数本身):继承自
Function.prototype
- Function.prototype:继承自
Object.prototype
- Object.prototype:继承自
null
,原型链结束。
经验
1 |
|
your[req.body.key] = req.body.value
1 |
|