암시적 호출은 단순히 일부 메서드를 자동으로 호출하는 것을 의미하며 이러한 메서드는 후크처럼 외부에서 수정되어 설정된 동작을 변경할 수 있습니다.
아래에는 최근에 본 몇 가지 암시적 호출이 나열되어 있습니다.
var obj = { a: 1, toString: function () { console.log('toString') return '2' }, valueOf: function () { console.log('valueOf') return 3 } } console.log(obj == '2'); //依次输出 'valueOf' false console.log(String(obj));//依次输出 'toString' '2'
var obj = { a: 1, toString: function () { console.log('toString') return '2' }, valueOf: function () { console.log('valueOf') return {} //修改为对象 } } console.log(obj == '2'); //依次输出 'valueOf' 'toString' true console.log(Number(obj));//依次输出 'valueOf' 'toString' 2
을 추가하는 것을 환영합니다. 항등 연산자의 연산에서 객체는 먼저 호출합니다. valueOf 반환된 값이 객체인 경우 null을 제외하고 toSting이 호출되고 반환된 값이 비교에 사용됩니다. 첫 번째 예는 3 == '2'와 동일하며 false를 반환합니다. valueOf.object를 실행한 다음 toString을 실행하면 마지막으로 '2' == '2'와 동일하며 Number 및 String 메서드에서 Number는 먼저 valueOf를 호출한 다음 toString을 호출합니다. String 메서드는 그 반대입니다.
위의 두 가지 예 외에도 수치 연산과 같은 다양한 다른 연산에도 데이터 유형 변환이 존재합니다. 참조 유형이 포함되면 객체가 객체인 한 valueOf 또는 toString 메서드가 호출됩니다. 이 두 메소드를 상속하면 데이터 유형 변환 동작에 영향을 미치기 위해 이 두 메소드를 다시 재정의할 수 있습니다. 이벤트가 트리거된 후에 실행될 개체의 handlerEvent 메서드는 메서드가 실행될 때 eventObj를 가리키며 전달하려는 데이터를 eventObj 개체
var eventObj = { a: 1, handleEvent: function (e) { console.log(this, e);//返回 eventObj 和 事件对象 alert(this.a) } } document.addEventListener('click', eventObj)
var Obj = { a: 10, toJSON: function () { return { a: 1, b: function () { }, c: NaN, d: -Infinity, e: Infinity, f: /\d/, g: new Error(), h: new Date(), i: undefined, } } } console.log(JSON.stringify(Obj)); //{"a":1,"c":null,"d":null,"e":null,"f":{},"g":{},"h":"2018-02-09T19:29:13.828Z"}
var Obj1 = { a: 10, toJSON: function () { console.log(this === Obj1);//true return this } } console.log(JSON.stringify(Obj1));//{"a":10}객체 속성 접근자 get 및 set
var Obj2 = { a: 10, toJSON: function () { console.log(this === Obj2);//true return { a: this } } } console.log(JSON.stringify(Obj2));//报错 Maximum call stack size exceeded나이에 상관없이 볼 수 있는 설정은 무엇인가요? 18세 이하입니다. 속성 액세스를 수행할 때 객체 속성의 해당 get set 함수가 실제로 호출됩니다. 위의 쓰기 방법 외에도 다음과 같은 쓰기 방법도 있습니다
var obj = { then: function (resolve, reject) { setTimeout(function () { resolve(1000); }, 1000) } } Promise.resolve(obj).then(function (data) { console.log(data);// 延迟1秒左右输出 1000 })
var timePromise = function (time) { return new Promise(function (resolve) { setTimeout(function () { resolve(time); }, time) }) } var timePromise1 = timePromise(1000); var timePromise2 = timePromise(2000); var timePromise3 = timePromise(3000); Array.prototype.then = function (resolve) { setTimeout(function () { resolve(4000); }, 4000) } Promise.all([timePromise1, timePromise2, timePromise3]).then(function (time) { console.log(time);// 等待4秒左右输出 4000 })
위 내용은 자바스크립트의 암시적 호출에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!