欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > javascript —— ! 和 !! 的区别与作用

javascript —— ! 和 !! 的区别与作用

2025/5/16 14:57:04 来源:https://blog.csdn.net/m0_58680865/article/details/147982477  浏览:    关键词:javascript —— ! 和 !! 的区别与作用

javascript —— ! 和 !! 的区别与作用

在 JavaScript 里,! 和 !! 是两种不同的逻辑运算符,它们的功能和使用场景有明显区别。

1、 !(逻辑非运算符)

它的主要作用是 对操作数进行布尔值取反。具体来说,就是 先把操作数转换为布尔值,然后取其相反的值

代码示例:

console.log(!true);     // false
console.log(!false);    // true// 对于非布尔值,会先将其转换为布尔值再取反
console.log(!0);        // true(因为 0 转换为布尔值是 false)
console.log(!'');       // true(空字符串转换为布尔值是 false)
console.log(!null);     // true
console.log(!undefined);// true
console.log(!NaN);      // trueconsole.log(!5);        // false(因为 5 转换为布尔值是 true)
console.log(!'hello');  // false(非空字符串转换为布尔值是 true)
console.log(![]);       // false(空数组是对象,转换为布尔值是 true)
console.log(!{});       // false(空对象转换为布尔值是 true)

2、!!(双重逻辑非运算符)

它其实就是连续使用两次 ! 运算符。先通过第一个 ! 对操作数取反,再用第二个 ! 对取反后的结果再次取反,最终得到的是操作数对应的布尔值。

console.log(!!true);    // true
console.log(!!false);   // false// 对于非布尔值,会将其转换为对应的布尔值
console.log(!!0);       // false
console.log(!!'');      // false
console.log(!!null);    // false
console.log(!!undefined);// false
console.log(!!NaN);     // falseconsole.log(!!5);       // true
console.log(!!'hello'); // true
console.log(!![]);      // true
console.log(!!{});      // true

3、 核心区别

  • !:能将任何值转换为布尔值,并且结果与该值本身的布尔值相反。
  • !!:同样可以把任何值转换为布尔值,但结果和该值本身的布尔值相同。其本质和 Boolean() 函数的作用一样。

4、使用场景

  • !:用于条件判断中取反
const value = null;
if (!value) {console.log('值为假值(false)');
}
  • !!:用于将一个值强制转换为布尔类型,在需要布尔值的场景中经常会用到。
const value = 'hello';
const isTruthy = !!value; // true
console.log(`值是否为真值:${isTruthy}`);

5、在 vue 项目中的使用

(1)!(逻辑非运算符)在 vue 中的使用

模板中的条件判断

在模板里进行条件渲染时,! 可以对数据进行取反操作。

<template><div><!-- 如果 isLoading 为 false,则显示内容 --><div v-if="!isLoading">内容已加载</div><!-- 如果 user 为空,则显示提示 --><div v-if="!user">请先登录</div></div>
</template>
计算属性中返回取反结果

在计算属性里,! 能够返回取反后的布尔值。

<template><div><button :disabled="isDisabled">提交</button></div>
</template><script>
export default {computed: {isDisabled() {// 当表单无效时禁用按钮return !this.formIsValid;}}
}
</script>

(2)!!(双重逻辑非运算符)

强制转换为布尔值

在模板表达式或者计算属性中,!! 能把值强制转换为布尔值,这在需要布尔值的场景中很有用。

<template><div><!-- 将 message 转换为布尔值,判断是否显示消息提示 --><Alert v-if="!!message" :type="messageType">{{ message }}</Alert><!-- 显示数据是否存在的状态 --><span>{{ !!user ? '已登录' : '未登录' }}</span></div>
</template>
监听事件时处理参数

在监听事件并处理参数时,!! 可将参数转换为布尔值。

<template><div><input type="checkbox" @change="handleChange"></div>
</template><script>
export default {methods: {handleChange(event) {// 将事件的选中状态转换为布尔值const isChecked = !!event.target.checked;this.updateStatus(isChecked);}}
}
</script>

(3)Vue 特有的注意事项

在 v-bind 中使用

在使用 v-bind 绑定布尔属性时,!! 可以确保传入的值是布尔类型。

<template><div><!-- 确保 loading 是布尔值 --><Spinner :loading="!!loadingState" /></div>
</template>

(4)对比示例

<template><div class="user-profile"><!-- 使用 ! 进行条件判断 --><div v-if="!user"><button @click="login">登录</button></div><!-- 使用 !! 强制转换为布尔值 --><div v-if="!!user"><img :src="user.avatar" alt="用户头像"><h3>{{ user.name }}</h3><!-- 在计算属性中使用 ! --><button :disabled="!canEdit">编辑资料</button></div></div>
</template><script>
export default {data() {return {user: null, // 假设这是从 API 获取的用户数据canEdit: true}},methods: {login() {// 登录逻辑...}},computed: {// 使用 !! 将值转换为布尔值hasAvatar() {return !!this.user?.avatar;}}
}
</script>

6、总结

  • ! 是取反操作,得到的结果是布尔值,且与原值的布尔值相反。
  • !! 是强制类型转换,得到的结果也是布尔值,和原值的布尔值相同。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词