Académique Documents
Professionnel Documents
Culture Documents
Ignition Optimized
Code
Optimize
Bytecode Turbofan
Interpreted Optimized
How to Make use of
that ?
Hidden Class
function Point(x, y) {
this.x = x;
A Point Initial Hidden
this.y = y;
Object Class H0
}
var p1 = new Point(1, 2);
Offset 0: x Offset 0: x
Offset 1: y Offset 1: y
Polymorphic
Offset 0: x
Offset 1: y
Offset 2: z
Optimization Killer
Unsupported Syntax
Workaround
function containsObjectLiteralWithProto() { var errorObject = {value: null};
return {__proto__: 3}; function tryCatch(fn, ctx, args) {
} try {
return fn.apply(ctx, args);
}
catch(e) {
function containsObjectLiteralWithGetter() {
errorObject.value = e;
return {
return errorObject;
get prop() {
}
return 3;
}
}
};
var result = tryCatch(mightThrow, void 0, [1,2,3]);
}
//Unambiguously tells whether the call threw
if(result === errorObject) {
var error = errorObject.value;
function containsObjectLiteralWithSetter() { }
return { else {
set prop(val) { //result is the returned value
this.val = val; }
}
};
}
Unmanaged Arguments
Workaround
function reAssignParam(a, b_) {
function defaultArgsReassign(a, b) { var b = b_;
if (arguments.length < 2) b = 5; //unlike b_, b can safely be reassigned
} if (arguments.length < 2) b = 5;
}
Unmanaged Arguments
Workaround
function doesntLeakArguments() {
function leaksArguments1() { //.length is just an integer, this doesn't leak
return arguments; //the arguments object itself
} var args = new Array(arguments.length);
for(var i = 0; i < args.length; ++i) {
function leaksArguments2() { //i is always valid index in the arguments object
var args = [].slice.call(arguments); args[i] = arguments[i];
} }
return args;
function leaksArguments3() { }
var a = arguments;
return function() { function anotherNotLeakingExample() {
return a; var i = arguments.length;
}; var args = [];
} while (i--) args[i] = arguments[i];
return args
}
Unmanaged Arguments
function assignToArguments() {
arguments = 3;
return arguments; There’s no workaround, just remove this.
}
Switch-Case
function over128Cases(c) {
switch(c) {
case 1: break;
case 2: break;
case 3: break;
... Use if else or Array of Function
case 128: break;
case 129: break;
}
}
For-In
function nonLocalKey1() {
var obj = {}
for(var key in obj);
return function() {
return key;
};
}
Always use local variable
var key;
function nonLocalKey2() {
var obj = {}
for(key in obj);
}
For-In
function hashTableIteration() {
var hashTable = {"-": 3};
for(var key in hashTable); Use simple enumerable object
}
For-In
Workaround
let a = 0;
let a = 0, b = 3; let b = 3;
let a = 0; let a = 0;
a += 5; a = a + 5;
For-In