-
Notifications
You must be signed in to change notification settings - Fork 45
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Day6 - new 一个构造函数,如果函数返回 return {}
、 return null
, return 1
, return true
会发生什么情况?
#7
Comments
结论只有在构造函数 回答
|
如果函数返回 return {} 、 return null , return 1 , return true 会发生什么情况? // mock_new.js
export function mockNew() {
const obj = {};
const constructor = Array.prototype.shift.call(arguments);
obj.__proto__ = constructor.prototype;
const res = constructor.call(obj, arguments);
return typeof res !== 'object' || res === null ? obj : res;
}
// __test__/interview/mock_new
import { mockNew } from '../../code/interview/mock_new';
function returnObj() {
this.type = 'object';
return {
return: 'obj',
};
}
function returnNumber() {
this.type = 'number';
return 0;
}
function returnBoolean() {
this.type = 'boolean';
return false;
}
function returnSymbol() {
this.type = 'symbol';
return Symbol('hello');
}
function returnString() {
this.type = 'string';
return 'abc';
}
function returnUndefined() {
this.type = 'undefined';
return undefined;
}
function returnNull() {
this.type = 'null';
return null;
}
function returnBigInt() {
this.type = 'BigInt';
return 999n;
}
describe('test mockNew', () => {
test('return {}', () => {
expect(mockNew(returnObj)).toEqual({
return: 'obj',
});
});
test('return Number', () => {
expect(mockNew(returnNumber)).toEqual({
type: 'number',
});
});
test('return Boolean', () => {
expect(mockNew(returnBoolean)).toEqual({
type: 'boolean',
});
});
test('return Symbol', () => {
expect(mockNew(returnSymbol)).toEqual({
type: 'symbol',
});
});
test('return String', () => {
expect(mockNew(returnString)).toEqual({
type: 'string',
});
});
test('return Undefined', () => {
expect(mockNew(returnUndefined)).toEqual({
type: 'undefined',
});
});
test('return Null', () => {
expect(mockNew(returnNull)).toEqual({
type: 'null',
});
});
test('return BigInt', () => {
expect(mockNew(returnBigInt)).toEqual({
type: 'BigInt',
});
});
}); |
new 命令总是返回一个对象,要么是实例对象,要么是 return 语句指定的对象 如果 return 返回的是基础数据类型,不会受到影响 |
new 命令如果 return 是一个对象,那么则返回该对象。如果不是对象,那么则是该构造函数创建的新对象。 |
构造函数返回{}new之后也会返回这个{}, 其他情况都会返回实例对象 |
构造函数内返回分为基础类型和引用类型,如果是引用类型,如{}则会返回{},基础类型如1、true则返回实例对象,null在typeof中被作为对象,但是实际上return null 也返回实例对象 |
如果函数 return {} 会返回 {} new 一个构造函数,会返回一个对象,如果构造函数中 return 了一个对象,则 new 之后直接返回该对象,否则则返回新创建的对象 |
|
new 一个构造函数,如果这个构造函数体内return的是一个对象,那么就直接返回该对象; |
如果return引用类型返回return后面的代码; |
new一个构造函数,如果return后面是基础类型,会返回new生成的对象,否则的话他会直接返回函数的返回值 |
如果构造函数return 的值是引用类型 则返回这个值 |
new 一个构造函数的时候,如果函数返回对象,数组或者函数,则返回函数的返回值,否则返回新创建的实例。 |
new 一个构造函数的时候,如果函数返回值是一个不为null的object,或者是一个function,则使用这个返回值,否则返回创建的实例对象 |
如果没有 如果函数返回
|
new 一个构造函数,如果函数返回 return {} 、 return null , return 1 , return true 会发生什么情况?
|
这4中情况除了返回对象会返回构造函数的返回值外,其它情况都会返回new内部创建的新对象。 |
MDNnew 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。 结论new 操作在函数没有默认返回值的情况下, 返回新创建的实例对象, 同时如果返回数据类型为基础数据类型时也是返回实例对象, 原因个人猜测, new 作为JS的一个操作符, 其主要作用是返回构造函数的内置对象的实例, 但为了保证我们可以在需要的时候返回自定义的实例, 实现其他特定的需求, 所以设定当用户有返回自定义的对象时, 则返回自定义的对象, 否则其他情况一律返回构造函数的内置对象实例.(PS: 所有的引用类型本质都是对象) |
new 一个构造函数,如果函数返回 return {},会返回空对象,其余情况返回构造函数的实例对象。 |
return {}
、 return null
, return 1
, return true
会发生什么情况?return {}
、 return null
, return 1
, return true
会发生什么情况?
The text was updated successfully, but these errors were encountered: