SOURCE

// console.log(0b111110111 === 503)
// console.log(0o767 === 503 )
// console.log(Number('0b111') )

// console.log(Number.isFinite(123))
// console.log(Number.isFinite('123'))
// console.log(isFinite('123'))

// console.log(Number.isNaN(123))
// console.log(Number.isNaN('NaN'))
// console.log(Number.isNaN(NaN))
// console.log(isNaN(NaN)) //true
// console.log(isNaN('NaN')) //false
// console.log(isNaN('123')) //false
// console.log(isNaN(undefined)) //true
// console.log(isNaN('undefined'))//true


// console.log(Number(undefined))//NaN
// console.log(Number(null)) //0
// console.log(Number(NaN)) //NaN
// console.log(0.1 + 0.2)

/**
 * Math.trunc 
 * 获得数值的整数部分 非数值可以用Number先进行转化,否则返回NaN
*/
function myTrunc(x){
    return x>0? Math.floor(x):Math.ceil(x);
}
// console.log(myTrunc(1.2));
// console.log(myTrunc(-90.2));
// let x='a'
// x=+x;
// console.log(x)
// console.log(isNaN(x))
function mySign(x){
    x=+x;
    if(x===0 || isNaN(x)){
        return x
    } 
    return x>0?1:-1;
}
// console.log(mySign(12))
// console.log(mySign(-12))
// console.log(mySign(0))
// console.log(mySign(-0))
// console.log(mySign(undefined))

// console.log(Number([]))  //0
// console.log(Number({}))  //NaN

//Number方法
// console.log(Number(NaN)); //NaN
// console.log(Number(null)); //0
// console.log(Number(undefined));//NaN
// console.log(Number('11'));//11
// console.log(Number('ABC'));//NaN
// console.log(Number([]));//0
// console.log(Number([1,2,3]));//NaN
// console.log(Number({}));//NaN
// console.log(Number([1]));//1
// console.log(Number(true));//1
// console.log(Number())//0
// console.log(Number(function(){return 1+1}))//NaN

// console.log(Math.hypot(3, 3, true)); // NaN

// console.log(typeof 123n)
// console.log(typeof 123)

// let p = 1n;
// for (let i = 1n; i <= 70n; i++) {
//   p *= i;
// }
// console.log(1n+2n); // 1.197857166996989e+100

// function foo(x = 5) {
//   let x = 1; // error
//   const x = 2; // error
// }
// foo(11)

//果没有提供参数,函数foo的参数默认为一个空对象
function foo({x, y = 5}={}) {
  console.log(x, y);
}
// foo({})
// foo({x:1,y:2})
// foo({x:1})
// foo()

// 写法一
function m1({x = 0, y = 0} = {}) {
  return [x, y];
}
// 写法二
function m2({x, y} = { x: 0, y: 0 }) {
  return [x, y];
}

// console.log(m2({}))

// console.log((function (a = 0, b, c) {}).length) // 0
// console.log((function (a, b = 0, c) {}).length) // 1
// console.log((function (a, b , c= 0) {}).length) // 2


let x = 1;
function f(y = x) {
  let x = 2;
  console.log(y);
}
// f() // 1

var x1=0;
function m12(){
    x1+=2;
    console.log(x1);
}
// m12();//2
// console.log(x1);//2

let x2=0;
function m12(){
    x2=x2+2;
    console.log(x2);
}
// m12(x2);//2
// console.log(x2);//0


// var x4 = 1;
// function foo(x4, y = function() { x4 = 2; }) {
//   var x9= 3;
//   console.log(x9,x4);
//   y();
//   console.log(x9,x4);
// }
// foo() // 3
// console.log(x4)
// > 3,undefined
// > 3,2
// > 1

// var x4 = 1;
// function foo(x4, y = function() { x4 = 2; }) {
//   console.log(x4);
//   var x4= 3;
//   console.log(x4);
//   y();
//   console.log(x4);
// }
// foo() // 3
// console.log(x4)
// > undefined
// > 3
// > 3
// > 1


var x4 = 1;
function foo(x4, y = function() { x4 = 2; }) {
  console.log(x4);//undefined
  x4= 3;
  console.log(x4);//3
  y();
  console.log(x4);//2
}
// foo() 
// console.log(x4)//1


function throwIfMissing() {
  throw new Error('Missing parameter');
}
//这表明参数的默认值不是在定义时执行,而是在运行时执行
function foo(mustBeProvided = throwIfMissing()) {
  return mustBeProvided;
}
// foo()
// Error: Missing parameter
//这表明参数的默认值不是在定义时执行,而是在运行时执行


function foo(x,y,optional = undefined) { 
    console.log(x,y,optional)
 }
foo(3,4)

console 命令行工具 X clear

                    
>
console