检查某个值是真还是假的条件是构建任何软件(无论是网站还是桌面应用程序)的基本部分。
在使用不同的编程语言时,了解它们如何处理真假对于编写可靠的代码至关重要。
JavaScript 和 PHP 是 Web 开发中使用最广泛的两种语言,它们对这些值及其检查的处理方式不同。让我们来探讨一下这些差异及其实际影响。
JavaScript 的真实性方法
JavaScript 与 PHP 处理真假的最大区别在于它如何处理空数组和对象。
在我们了解它如何实现这一点之前,让我们先了解一些基本原理。
JavaScript 将以下值视为 false:
const value1 = false // Boolean false
const value2 = 0 // Number zero
const value3 = "" // Empty string
const value4 = null // null
const value5 = undefined // undefined
const value6 = NaN // Not a Number
这包括 Vue.js 等框架中的引用:
const ref1 = ref(false)
const ref2 = ref(0)
const ref3 = ref("")
const ref4 = ref(null)
const ref5 = ref(undefined)
const ref6 = ref(NaN)
令人困惑的是,以下值及其 ref 等价物是真实的:
const value7 = [] // Empty array
const value8 = {} // Empty object
const value9 = "0" // String containing "0"
为什么会这样呢?
它与记忆有关
在 JavaScript 中,空数组和对象被视为“真实的”,因为它们是有效的对象引用。
这是 JavaScript 类型系统的一个基本方面以及它如何处理真实性。
// Arrays and Objects are references to memory locations
// Even when empty, they are still valid references
const emptyArray = [] // Points to a valid array in memory
const emptyObject = {} // Points to a valid object in memory
// When converted to boolean, any valid reference is true
Boolean([]) // true
Boolean({}) // true
// Compare this with actual falsy values
Boolean(0) // false
Boolean("") // false
Boolean(null) // false
Boolean(undefined) // false
这是故意的
做出此设计选择的原因是:
空数组/对象仍然是有效的数据结构,你可以向其中添加项目
空数组和空对象是引用类型(指向内存中的位置),而不是原始值
拥有引用,即使对一个空容器,也不同于什么都没有(null/undefined)
PHP 的不同视角
对于许多开发人员来说,PHP 采取了一种更直观的方法,将空数据结构视为虚假值。
重申一下,空数组和空对象在 PHP 中实际上被视为“假的”,这是 PHP 和 JavaScript 之间的主要区别之一。
工作原理如下:
// Empty array is falsy
$emptyArray = [];
if (!$emptyArray) {
echo "Empty array is false"; // This will print
}
// Empty object is also falsy
$emptyObject = new stdClass();
if (!$emptyObject) {
echo "Empty object is false"; // This will print
}
// All these are also falsy in PHP:
$false = false; // Boolean false
$zero = 0; // Integer 0
$zeroFloat = 0.0; // Float 0.0
$empty = ""; // Empty string
$null = null; // null
$emptyArray = []; // Empty array
检查 JavaScript 中空数组和对象的真实性和虚假性
如果您需要在 JavaScript 中检查这些数据类型的真假,则必须使用适当的方法:
//For an array
[].length === 0 // true - explicitly checking emptiness
//For an object
Object.keys({}).length === 0 // true - explicitly checking emptiness
对 ref 进行同样操作:
const arrayRef = ref([]);
const objectRef = ref({});
// Correct way to check emptiness
if (arrayRef.value.length === 0) {
console.log('Array is empty');
}
if (Object.keys(objectRef.value).length === 0) {
console.log('Object is empty');
}
检查 PHP 中空数组和对象的真实性和虚假性
PHP 的检查真假的直观方法对开发人员来说非常方便。它的工作原理如下:
// Empty data structures are falsy in PHP
$emptyArray = [];
$emptyObject = new stdClass();
if (!$emptyArray) {
echo "This will execute because empty arrays are falsy\n";
}
if (!$emptyObject) {
echo "This will execute because empty objects are falsy\n";
}
关于 PHP 的 empty()
许多开发人员使用 empty() 来检查真假,甚至对于空数组和对象也是如此。
PHP empty() 函数是一个内置函数,用于检查变量是否为空。其工作原理如下:
// All these will return true with empty()
empty(""); // Empty string
empty(0); // Zero as integer
empty(0.0); // Zero as float
empty("0"); // String "0"
empty(null); // null
empty(false); // Boolean false
empty([]); // Empty array
empty(new stdClass()); // Empty object
empty($undefined_var); // Undefined variable
// Examples of non-empty values
empty("0.0"); // false - string containing "0.0"
empty("string"); // false - non-empty string
empty(true); // false - boolean true
empty(42); // false - non-zero number
empty([0]); // false - array with element
// PHP's empty() function is very versatile
$various_values = [
"", // empty string
0, // zero
"0", // string zero
null, // null
false, // boolean false
[], // empty array
new stdClass() // empty object
];
foreach ($various_values as $value) {
if (empty($value)) {
echo "Value is considered empty in PHP\n";
}
}
empty() 的主要优点是可以安全地用于未定义的变量。它不会像使用 isset() 那样触发警告(请参阅下面的解释和示例代码)。这使得它在表单处理中特别有用:
// Safe form input checking
if (empty($_POST['username'])) {
echo "Please enter a username";
}
// Checking object properties
$user = new stdClass();
if (empty($user->name)) {
echo "Name is required";
}
值得注意的是,empty() 是一种语言结构,而不是函数,这意味着您不能将其用作回调或变量函数。
以下示例说明了为什么 empty() 不能用作回调或变量函数,这与常规 PHP 函数不同:
// This works with regular functions
$callback = 'strlen';
echo $callback("test"); // Works fine: outputs 4
// This will NOT work with empty()
$checker = 'empty';
$value = [];
echo $checker($value); // Error: Call to undefined function empty()
// This also won't work in array_filter
$values = ["", "test", 0, 1, [], [1,2]];
// This will NOT work
array_filter($values, 'empty'); // Error
// Instead, you need to use a closure/anonymous function
array_filter($values, function($value) {
return empty($value);
});
// Or with arrow function syntax (PHP 7.4+)
array_filter($values, fn($value) => empty($value));
再次,empty() 是一种语言结构(如 isset() 或 unset()),类似于运算符或控制结构,而不是常规函数。
当 isset() 触发警告时
在 PHP 中,isset() 是一个用于确定变量是否设置且不为空的函数。
如果变量存在且具有除 null 之外的值,则 isset() 返回 true;否则,返回 false。
它不会因未定义的变量而触发错误,但在带有数组键的非数组类型上使用时会产生警告。这通常发生在尝试将数组键与未初始化的变量一起使用时。
例如:
// Example: Triggering a warning with isset()
$data = null;
// Trying to check isset() on an undefined array key
if (isset($data['key'])) {
echo "Key exists.";
} else {
echo "Key does not exist.";
}
在此示例中
在这种情况下,$data 为空,因此它不是一个数组。
使用 $data['key'] 会触发警告,因为您尝试访问非数组的变量的索引。
如果你这样做,你会收到如下警告:
Warning: Trying to access array offset on value of type null
Key does not exist.
为了避免这种情况,您可以在使用 isset() 之前添加类型检查:
<?php
$data = null;
if (is_array($data) && isset($data['key'])) {
echo "Key exists.";
} else {
echo "Key does not exist.";
}
?>
这可以帮助您避免警告,因为 is_array() 在尝试访问键之前会验证 $data 是一个数组。
实际意义
JavaScript 和 PHP 在处理空数组和对象以及真假方面的差异对代码设计和调试具有重大影响:
在 JavaScript 中,您需要明确检查空集合,这会使代码更加冗长但也更加精确。
PHP 的方法可以使条件逻辑更简单,但是当您需要区分不同类型的空值时可能需要额外的检查。
在两种语言之间转换代码时,通常需要特别注意这些差异以保持预期的行为。
考虑一下这个常见的场景:
// JavaScript - checking for empty data
function processData(data) {
if (!data) {
// This won't catch empty arrays or objects
return 'No data provided';
}
if (Array.isArray(data) && data.length === 0) {
return 'Empty array provided';
}
// Process data...
}
// PHP - checking for empty data
function processData($data) {
if (empty($data)) {
// This will catch empty arrays and objects
return 'No data provided';
}
// Process data...
}
对于使用 JavaScript 和 PHP 的开发人员来说,理解这些根本区别至关重要,例如那些使用 Laravel 和 React 或 Vue 的开发人员。
这样做将帮助您编写更可靠的跨平台代码,并避免在语言之间切换时常见的陷阱。
我希望这能消除在 JavaScript 和 PHP 中使用真值和假值的困惑。有问题或意见?请随意在下面发表。如果您在这里和社交媒体上分享这篇文章,我也会受益匪浅。
评论区见!

