Javascript 1 === 1是假的

Tho*_*hes -3 javascript numbers equals

在发现React JS之后,我对Javascript相当新,并且遇到了一个我不明白的问题.

我有以下代码,该控制台将两个变量记录为具有相同值的数字.然而它显示为假......为什么?

非常感谢你提前.

<Nav tabs>
    {
        navigation.map((page, i) => {
            ++i;

            var match = this.state.activeTab === { i };

            console.log(
                typeof(i) + " " + i,
                typeof(this.state.activeTab) + " " + this.state.activeTab,
                match
            );

            return (
                <NavItem>
                    <NavLink
                        className={
                            classnames({
                                active: match,
                                'cursor-pointer': true
                            })
                        }
                        onClick={() => { this.toggleTab({ i }) }}
                    >
                        { page.name }
                    </NavLink>
                </NavItem>
            )
        })
    }
</Nav>
Run Code Online (Sandbox Code Playgroud)

我在控制台日志中得到以下内容:

app.js:89525 number 1 number 1 false
app.js:89525 number 2 number 1 false
app.js:89525 number 3 number 1 false
app.js:89525 number 4 number 1 false
app.js:89525 number 5 number 1 false
app.js:89525 number 6 number 1 false
Run Code Online (Sandbox Code Playgroud)

当然第一个日志应该显示为true.

T.J*_*der 6

{ i }不是i,它(从ES2015开始)是一个带有属性的对象i.所以自然如果this.state.activeTab1,this.state.activeTab === { i }是假的,因为一个数字不能是===一个对象.

你要

var match = this.state.activeTab === i;
 // No {} ---------------------------^
Run Code Online (Sandbox Code Playgroud)


Cer*_*rus 6

我不确定是什么this.state.activeTab,但它永远不会相等{ i }.

你不是在与那里的数字进行比较,而是与包含数字的新对象进行比较.

这种新的对象,{ i }返回true了全等比较(===),如果你与自己进行比较,这activeTab显然不是.

这可能会修复您的代码:

var match = this.state.activeTab === i;
Run Code Online (Sandbox Code Playgroud)

(假设activeTab是一个数字)