Object.prototype.toString.call 费解的地方

看第一条结果,为啥不是[object Object]费解,求大神解释

 <script>
    var name = {sex: '女'};
    var name2 = {a: 1};
    console.log(Object.prototype.toString.call(name)); // [object String] 按理说这里应该也是[object Object],可以使为啥不是呢?
    console.log(Object.prototype.toString.call({sex: '女'})); // [object Object]

    console.log(Object.prototype.toString.call(name2)); // [object Object]
    console.log(Object.prototype.toString.call({a: 1})); // [object Object]

</script>

如果是string类型,那么toString由特例,是调用的string.toString而不是object.toString,直接返回string,所以object String

(function{
      var name = {sex: '女'};
    var name2 = {a: 1};
    console.log(Object.prototype.toString.call(name)); // [object String] 按理说这里应该也是[object Object],可以使为啥不是呢?
    console.log(Object.prototype.toString.call({sex: '女'})); // [object Object]

    console.log(Object.prototype.toString.call(name2)); // [object Object]
    console.log(Object.prototype.toString.call({a: 1})); // [object Object]

})();
 (function(){
      var name = {sex: '女'};
    var name2 = {a: 1};
    console.log(Object.prototype.toString.call(name)); // [object String] 按理说这里应该也是[object Object],可以使为啥不是呢?
    console.log(Object.prototype.toString.call({sex: '女'})); // [object Object]

    console.log(Object.prototype.toString.call(name2)); // [object Object]
    console.log(Object.prototype.toString.call({a: 1})); // [object Object]

})();

name具有特殊之处,它不是javascript的关键字,也不是保留字,页面在IE浏览器上运行正常,但是Safari , chrome , Firefox和Opera这些浏览器都给函数定义了一个非标准的name属性,是window的自带全局属性,所以在全局声明name变量名会出现访问异常问题

不定义变量name,直接 console.log(name),不会报错。

var name = {sex: '女'};
console.log(name.sex) // undefined

var name1 = {sex: '女'};
console.log(name1.sex) // 女

let name = {sex: '女'};
console.log(name.sex) // 女