>  기사  >  웹 프론트엔드  >  Javascript_javascript 구문 분석 시 이해하기 어려운 11가지 문제 팁

Javascript_javascript 구문 분석 시 이해하기 어려운 11가지 문제 팁

WBOY
WBOY원래의
2016-05-16 17:10:161246검색

1. 원래 값과 참고 값

원래 값은 스택에 저장되고 참조 값은 힙에 저장됩니다. 예를 들어 프로그램은

코드를 복사합니다 코드는 다음과 같습니다.

function Person(id,name,age){
this.id = id;
this.name = name;
this.age = 나이;
}

var num = 10;
var bol = true;
var str = "abc";
var obj = new Object();
var arr = ['a','b ','c'];
var person = new Person(100,"바보의 좌우명",25);

2.정의되지 않음 및 null

정의되지 않음: 변수가 정의되지 않았습니다. 정의되지 않은 유형의 독점 값입니다.

null: 참조가 할당되지 않으며 Null 유형의 배타적 값입니다.

typeof(undefine)== undefine;

typeof(null) == 객체;
undefine==null;
undefine!==null;
null 인스턴스of 객체 == false;
정의되지 않은 객체 인스턴스 == false;

정의되지 않음 및 Null 유형이 있지만 다음 예에서는 이 두 유형이 보이지 않으므로 해당 값만 사용할 수 있음을 보여줍니다.

경고(정의되지 않은 인스턴스);

경고(Null의 null 인스턴스);

3. 의사 배열

특징:

1) 길이 속성이 있습니다.

2) 배열처럼 인덱스 순서로 데이터에 액세스합니다.

3) 푸시, 팝, 슬라이스 등 배열별 데이터 조작 방법이 없습니다...

의사 배열은 Array.prototype.slice를 통해 실제 배열로 변환할 수 있습니다.

var FaceArray = {0: 'a', 1: 'b', length: 2}//표준 의사 배열;

var realArray = Array.prototype.slice.call(fakeArray);

js의 유사 배열: 인수, node.childNodes, document.getElementsByTagName()...

IE의 문제: IE의 node.childNodes를 슬라이스로 변환할 수 없습니다.

Jquery의 의사 배열: Jquery 자체는 의사 배열입니다.

alert($('.class1').length); 경고($('.class1').[0].tagName);

4. 단순형 리터럴에 대하여

var a = 1; b = true, c = "ccc";

리터럴에 유형이 있는 것처럼 보입니다

alert(typeof a);//number

alert(typeof b);//boolean

alert(typeof c);//string

그러나 인스턴스 오브를 통해서는 측정할 수 없습니다

alert(숫자 인스턴스)//false

alert(객체 인스턴스)//false

alert(b 인스턴스of Boolean)//false
alert(b 인스턴스of객체)//false
alert(c 인스턴스ofString)//false
alert(c 인스턴스ofObject)//false

5. 함수의 프로토타입 속성과 객체 인스턴스의 내부 프로토타입 속성

각 함수(생성자)에는 프로토타입 속성이 있고, 각 객체 인스턴스에는 생성자 프로토타입 속성을 가리키는 보이지 않는(Mozilla가 공개하고 __proto__를 통해 얻을 수 있음) 내부 프로토타입 속성이 있습니다. 프로토타입 체인을 구성하는 자체 프로토타입 속성입니다. Object가 최상위 개체이므로 모든 프로토타입 체인은 결국 Object.prototype을 가리킵니다. 개체 인스턴스의 속성/메서드에 액세스할 수 없으면 개체 인스턴스 자체에서 검색을 시작합니다. 찾을 수 있으면 Object.prototype.prototype == null이 될 때까지 프로토타입 체인을 따라 위쪽으로 검색하세요.

6. 생성자의 작은 비밀


코드를 복사하세요 코드는 다음과 같습니다.
var s = new function(){return "sss"};
alert(s);//[object Object]
s = new function(){return new String ("sss" )};
alert(s);//sss


이 코드에 대한 설명:

new 표현식 뒤의 생성자가 참조 객체(배열, 객체, 함수 등)를 반환(반환)하는 한, 기본 유형( 반환이 없으면 실제로는 원래 유형이 정의되지 않은 반환입니다. 그러면 new에 의해 생성된 익명 객체가 반환됩니다.

7. 객체 생성 과정

function Person(name){
this.name = name
}
Person.prototype = {
getName: function(){return this.name }
};

var p = new Person('장산');


p:

생성 프로세스의 암호를 해독합니다.

◦ 내장 객체 obj를 생성하고 초기화합니다.

◦ p의 내부 [[Prototype]]을 Person.prototype으로 지정합니다.

◦ p를 사용하고 인수 매개변수를 사용하여 Person의 내부 [[Call]] 메서드를 호출합니다. 즉, Person 함수 본문을 실행하고 반환 값을 반환합니다.

◦ 이전 단계에서 Object 유형을 반환한 경우 이 값을 p로 반환하고, 그렇지 않으면 obj를 반환합니다.

8. 객체의 소유 및 상속 속성

코드 복사 코드는 다음과 같습니다. 🎜 >
function Person(이름){
this.name = name;
}
Person.prototype = {
type: 'human',
getName: function ( ){return this.name} 
};
var p = new Person('zhangsan');
alert(p.hasOwnProperty('type'));//false
p. type = 'ren';
alert(p.hasOwnProperty('type'));//true

실행 결과는 매우 명확하며 객체의 속성은 객체의 속성을 수정할 수 없습니다. 프로토타입에 동일한 이름이 있으며, 자체적으로 동일한 이름을 가진 속성만 생성하고 해당 속성에 값을 할당합니다.

9. 함수 객체 생성 과정

내장 객체 fn을 생성합니다.

fn의 내부 [[Prototype]]을 Function.prototype으로 설정합니다.

함수 호출 논리를 처리하는 내부 구현 메서드인 내부 [[Call]] 속성을 설정합니다. (간단히 함수 본문을 가리키는 것으로 이해);

fn.length를 funArgs.length로 설정합니다. 함수에 매개변수가 없으면 fn.length를 0으로 설정합니다.

fn.prototype의 생성자는 fn 자체를 가리킵니다.

fn으로 돌아가기

10.Instanceof의 원리

A가 B의 인스턴스인지 확인하려면 B의 프로토타입이 가리키는 객체(생성자의 프로토타입 속성)가 a의 프로토타입 체인에 있는지 확인해야 합니다.

11. 기능과 대상에 대한 추측

alert(함수의 함수 인스턴스);//true

alert(Object의 함수 인스턴스);//true
alert(함수의 개체 인스턴스);//true
alert(Object의 개체 인스턴스);/ /참

오래전부터 고민했지만, 제대로 생각해보지 못했어요...

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.